Python多久切换线程?

15
在cPython(默认的Python实现)中,线程切换发生的频率是多少?这不是关于使用多个核心的问题;我知道GIL(全局解释器锁)的存在,并且意识到一次只能运行一个线程。
我曾经遇到过几种情况,即我有两条日志信息连续出现,第一条日志信息将被发出,但第二条在几秒钟后才被发出。可能是因为Python在两个日志语句之间决定切换线程。这使我相信Python每隔几秒钟就会在线程之间切换,这比我预期的要慢得多。这是否正确?

2
或者你的日志消息被卡在了I/O缓冲区中。在多线程环境中记录日志时,可以在写入后“刷新”日志,这是一个好的实践。 - Stephane Martin
2
对于线程切换,请查阅http://www.dabeaz.com/python/UnderstandingGIL.pdf和“tick”的概念。 - Stephane Martin
还可以查看 sys.setcheckinterval 的文档。 - Lukas Graf
我同意 @StephaneMartin - 这更像是I/O缓冲。参见禁用输出缓冲 - Lukas Graf
1
正确链接 http://www.dabeaz.com/python/UnderstandingGIL.pdf - Peter Wood
@StephaneMartin - 你链接的PDF文件在第10页、第11页和第12页包含了我正在寻找的答案。如果你把它放在回答中,我会接受它。 - Buttons840
2个回答

23

默认情况下,Python 2会每100条指令切换线程。可以使用sys.setcheckinterval进行调整,此处有文档: https://docs.python.org/2/library/sys.html#sys.setcheckinterval

我在这个演示文稿的第10页、第11页和第12页找到了更多信息: http://www.dabeaz.com/python/UnderstandingGIL.pdf

(这些答案来自评论,但是由于没有人把它们写在答案中,我将自己写下来。评论已经超过6个月了。)

更新:

自Python 3.2以来,sys.setcheckinterval已被弃用。CPython有另一种方法来改进全局解释器锁(GIL)。他们不是每100条虚拟指令就释放GIL,而是改为按时间间隔切换。

默认情况下,GIL会在5毫秒(5000微秒)后释放,以便其他线程有机会获取GIL。您可以使用sys.setswitchinterval更改此默认值。


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接