2015-10-26 90 views
3

我看着在GIL的精彩演讲,并在翻译中运行时怎么只有1单一线程可以同时运行。它似乎也是python在线程切换方面不是很聪明。python如何处理线程锁定/上下文切换?

如果我线程化一些只能在解释器中运行的操作,并且它不是特别重的CPU,并且我使用一个线程锁,其中只有一个线程可以在这个相对较短的解释器绑定操作中一次运行,该锁实际上使任何运行速度变慢?而不是如果锁不是必需的,并且所有线程可以同时运行。

如果所有,但1线程被锁定,将Python解释器不知道上下文切换?

编辑: 通过“胡编运行速度较慢”我的意思是,如果Python是上下文切换一堆锁的线程,将(可能)是一个性能下降,即使线程不实际运行

+1

我相信本地线程是由操作系统调度,而不是Python解释器切换。 – user996142

回答

2

蟒蛇是不是很聪明约线程之间的切换

Python的线程工作:-)

一定的方式,如果我使用一个线程锁只有1个线程可以运行时间...将锁实际上使任何东西运行较慢

错误,没有因为没有别的可运行,所以没有别的可以运行 比较慢。

如果除1个线程之外的所有线程都被锁定,python解释器是否不知道上下文切换?

是。内核知道哪些线程可以运行。如果没有其他线程可以运行,那么从逻辑上讲(就线程而言),python解释器不会从唯一可运行线程切换到上下文。线程不知道什么时候它已经被切换(它怎么可能,它没有运行)。

+0

因此,python intepreter将永远不会切换到一个锁定的线程上下文?我想这是有道理的,因为任何时候你使用锁定都会对性能产生负面影响。 我想我对python2.6如何处理信号和线程感到困惑,特别是当主程序在线程连接上被阻塞时,当你点击ctrl-c时,这让我觉得python的确没有智能的上下文切换。 无论如何,谢谢你清理它。 –

4

拉里黑斯廷斯(核心CPython开发人员)有一个很好的演讲,涵盖了这个题目“Python's Infamous GIL”。如果你跳到11点40分,他给出你的问题的答案。

从谈话:一路Python的线程与GIL工作是一个简单的计数器。每执行一个100字节的代码,GIL就应该被当前正在执行的线程释放,以便让其他线程有机会执行代码。由于线程发布/获取机制,此行为在Python 2.7中基本上被破坏了。它已被固定在Python 3

当你使用一个线程锁Python将只执行未锁定的线程。所以如果你有几个线程共享1个锁,那么只有一个线程会同时执行。在线程可以获取锁之前,Python不会开始执行锁定的线程。锁定在那里,所以你可以在线程之间共享状态而不会引入错误。

如果你有多个线程,只有1可以因为锁的时间运行,那么在理论上你的程序将需要更长的时间来执行。在实践中你应该进行基准测试,因为结果会让你感到惊讶。