CPython有一个全局解释器锁(GIL)。
因此,多个线程无法同时运行Python字节码。
CPython中threading
包的用途和相关性是什么?
答案 0 :(得分:2)
在I / O期间,GIL被释放到其他线程可以运行。
此外,一些扩展(如numpy
)可以在进行计算时释放GIL。
因此,一个重要的目的是提高不受CPU限制的程序的性能。来自threading
模块的Python文档:
CPython实现细节:在CPython中,由于Global Interpreter Lock,只有一个线程可以同时执行Python代码(即使某些面向性能的库可能会克服此限制)。如果您希望应用程序更好地利用多核计算机的计算资源,建议您使用
multiprocessing
或concurrent.futures.ProcessPoolExecutor
。但是,如果要同时运行多个I / O绑定任务,threading
仍然是一个合适的模型。
线程的另一个好处是可以在GUI程序中进行长时间运行的计算,而不必将计算量切成足够小的部分以使它们适合超时函数。
同时请记住,虽然CPython现在有一个GIL ,但未来可能并非总是如此。
答案 1 :(得分:1)
当python运行一些代码时,代码编译在" atomic"命令(=小指令)。每几百个原子指令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。