多CPU核上的Python线程

2024-09-09 13:07:58 发布

您现在位置:Python中文网/ 问答频道 /正文

使用下面的程序,我得到几乎100%的CPU使用率的所有核心。我使用的是Intel®Core™ Ubuntu20.04.2LTS(Focal Fossa)64位系统和python 3.8上的i5-8250U CPU@1.60GHz×8。我一直认为python使用的是绿色线程,由于GIL,一次只能使用一个内核。在https://docs.python.org/3/glossary.html#term-global-interpreter-lock处写着:

“CPython解释器使用的机制,用于确保一次只有一个线程执行Python字节码。这通过创建对象模型(包括关键的内置类型,如dict)简化了CPython的实现。”隐式安全,防止并发访问。锁定整个解释器使解释器更容易成为多线程的解释器,而牺牲了多处理器机器提供的大部分并行性。”

我到底怎么了

from threading import Thread

class TestThread(Thread):
    def __init__(self, name):
        Thread.__init__(self)
        self.name = name

    def run(self):
        for i in range(1000000):
            print(f"Thread {self.name} is running")


def create_threads():
    for i in range(100000):
        name = f"#{i}"
        my_thread = TestThread(name)
        my_thread.start()


if __name__ == "__main__":
    create_threads()

enter image description here

编辑: CPU负载可能来自执行所有IO的内核。但我仍然不明白的是,如果我只使用一个执行大量IO的python线程,为什么会有如此大的不同

if __name__ == "__main__":
    # create_threads()
    for i in range(100000000):
        print(f"in loop {i}")

enter image description here


Tags: nameinselffordefcreaterangecpu