CPython中的线程包

时间:2017-03-23 20:49:06

标签: python gil

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

  

CPython实现细节:在CPython中,由于Global Interpreter Lock,只有一个线程可以同时执行Python代码(即使某些面向性能的库可能会克服此限制)。如果您希望应用程序更好地利用多核计算机的计算资源,建议您使用multiprocessingconcurrent.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。