CPython 中的线程包



>CPython有一个全局解释器锁(GIL)。

因此,多个线程不能同时运行 Python 字节码。

那么threading包在CPython中的用途和相关性是什么?

在 I/O 期间,GIL 被释放到其他线程可以运行。 此外,一些扩展(如numpy)可以在进行计算时释放 GIL。

因此,一个重要目的是提高不受 CPU 限制的程序的性能。从threading模块的 Python 文档中:

CPython 实现细节:在 CPython 中,由于全局解释器锁,一次只有一个线程可以执行 Python 代码(即使某些面向性能的库可能会克服此限制)。如果你想让你的应用更好地利用多核机器的计算资源,建议使用multiprocessingconcurrent.futures.ProcessPoolExecutor。但是,如果要同时运行多个 I/O 绑定任务,threading仍然是合适的模型。

线程的另一个好处是在 GUI 程序中执行长时间运行的计算,而不必将计算切成足够小的部分以使它们适合超时函数。

还要记住,虽然CPython现在有GIL,但将来可能并不总是如此。

当python运行一些代码时,代码被编译为"原子"命令(=小指令)。每隔几百个原子指令,python就会切换到下一个线程并执行该线程的指令。这允许以伪并行方式运行代码。 假设您有以下代码:

def f1():
while True:
# wait for incomming connections and serve a website to them
def f2():
while True:
# get new tweets and process them

并且您希望同时执行f1()f2()。在这种情况下,您可以简单地使用threading,而不必担心时不时地中断循环来执行其他函数。这也比异步编程容易得多。

简单说:它使编写需要做多件事的脚本变得更容易。

此外,正如@roland-smith所说,Python在I/O和其他一些低级c代码期间释放了GIL。

最新更新