什么是全局解释器锁?为什么它是一个问题?
从Python中删除GIL引起了很多议论,我想知道为什么这一点如此重要。我自己从来没有写过编译器或解释器,所以不要在细节上节俭,我可能需要他们来理解。
发布于 2009-08-18 14:53:18
Python的GIL旨在序列化从不同线程对解释器内部的访问。在多核系统上,这意味着多线程不能有效地利用多核。(如果不是GIL导致了这个问题,大多数人都不会关心GIL -它只是作为一个问题被提出来,因为多核系统的日益流行。)如果您想详细了解它,您可以查看this video或查看this set of slides。这可能是太多的信息,但随后您确实询问了详细信息:-)
请注意,Python的GIL实际上只是CPython的一个问题,参考实现。Jython和IronPython没有GIL。作为Python开发人员,您通常不会遇到GIL,除非您正在编写C扩展。C扩展编写者需要在其扩展阻塞I/O时释放GIL,以便Python进程中的其他线程有机会运行。
发布于 2009-08-18 14:53:05
假设你有多个线程,它们并不真正接触彼此的数据。这些应该尽可能独立地执行。如果你有一个“全局锁”,为了(比方说)调用一个函数,你需要获取它,这可能会成为一个瓶颈。你可能一开始就没有从拥有多个线程中得到多少好处。
在现实世界中打个比方:想象一下,100名开发人员在一家公司工作,只有一个咖啡杯。大多数开发人员会把时间花在等待咖啡上,而不是编码上。
所有这些都不是特定于Python的-我不知道Python首先需要GIL来做什么的细节。但是,希望它能让您对一般概念有一个更好的了解。
发布于 2013-12-06 15:55:24
让我们首先了解一下python GIL提供了什么:
任何操作/指令都在解释器中执行。GIL确保解释器在的特定时刻由的单个线程持有。多线程的python程序可以在一个解释器中运行。在任何特定时刻,这个解释器都是由单个线程持有的。这意味着只有持有解释器的线程才能在的任意时刻运行。
为什么这是一个问题:
您的机器可能有多个内核/处理器。多核允许多个线程执行simultaneously,也就是说,多个线程可以在任何特定时刻执行。。但由于解释器由单个线程持有,因此其他线程不会执行任何操作,即使它们可以访问内核。因此,您不会获得多核提供的任何优势,因为在任何时刻,只有一个核被使用,这是当前持有解释器的线程正在使用的核。因此,您的程序将花费与单线程程序一样长的时间来执行。
然而,潜在的阻塞或长时间运行的操作,如I/O、图像处理和NumPy数字处理,发生在GIL之外。摘自here。因此,对于这样的操作,尽管存在GIL,多线程操作仍然比单线程操作更快。因此,GIL并不总是一个瓶颈。
编辑: GIL是CPython的实现细节。IronPython和Jython没有GIL,所以在它们中应该可以实现真正的多线程程序,虽然我从来没有使用过PyPy和Jython,但我不确定这一点。
https://stackoverflow.com/questions/1294382
复制相似问题