Python多久切换一次线程?

Python多久切换一次线程?,python,multithreading,Python,Multithreading,在cPython(默认的Python实现)中,线程切换多久发生一次?这不是使用多核的问题;我知道GIL,并且意识到一次只能运行一个线程 我见过一些情况,其中我有两个顺序的日志消息,第一个日志消息将被发出,但第二个消息在几秒钟内不会发出。这可能是因为Python决定在两个日志语句之间切换线程。这让我相信Python每隔几秒钟就在线程之间切换一次,这比我预期的要慢得多。这是否正确?默认情况下,Python 2将每100条指令切换一次线程。这可以通过sys.setcheckinterval进行调整,此

在cPython(默认的Python实现)中,线程切换多久发生一次?这不是使用多核的问题;我知道GIL,并且意识到一次只能运行一个线程


我见过一些情况,其中我有两个顺序的日志消息,第一个日志消息将被发出,但第二个消息在几秒钟内不会发出。这可能是因为Python决定在两个日志语句之间切换线程。这让我相信Python每隔几秒钟就在线程之间切换一次,这比我预期的要慢得多。这是否正确?

默认情况下,Python 2将每100条指令切换一次线程。这可以通过
sys.setcheckinterval
进行调整,此处有相关说明:

我在本演示文稿的第10、11和12页上找到了其他信息:

(这些答案来自于对问题的评论,但由于没有人在答案中写下它们,我将自己做。自评论发表以来已经6个多月了。)

更新:

自Python3.2以来,
sys.setcheckinterval
被弃用。CPython有另一种方法来改进GIL。他们没有在100条虚拟指令后释放GIL,而是改为按时间间隔切换


默认情况下,GIL将在5毫秒(5000微秒)后释放,以便其他线程可以进行更改以获取GIL。您可以使用

更改此默认值,因为Python 3.2解释器的线程切换时间间隔可以使用sys.setswitchinterval进行调整:


在早期版本中,解释器默认每100条虚拟指令检查一次周期性事件,如线程开关和信号处理程序。这可以通过
sys.setcheckinterval

修改,或者您的日志消息被卡在I/O缓冲区中。在登录多线程环境时,最好在“写入”之后“刷新”日志。对于线程切换,请检查“勾选”的概念,也请参阅文档,因为我同意@StephaneMartin的说法-这听起来更像是I/O缓冲。请参阅正确的链接