【问题标题】:How often does Python switch threads?Python多久切换一次线程?
【发布时间】:2015-10-19 22:35:40
【问题描述】:

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

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

【问题讨论】:

  • 或者您的日志消息卡在 I/O 缓冲区中。在多线程环境中登录时,在“写入”之后“刷新”日志可能是一个好习惯。
  • 对于线程切换,检查 dabeaz.com/python/UnderstandingGIL.pdf> 和 'tick' 的概念
  • 另见sys.setcheckinterval的文档
  • 我同意@StephaneMartin - 这听起来更像是 I/O 缓冲。见Disable output buffering

标签: python multithreading


【解决方案1】:

默认情况下,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

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

更新:

自 Python 3.2 起,sys.setcheckinterval 已被弃用。 CPython 有另一种改进 GIL 的方法。不是在 100 条虚拟指令后释放 GIL,而是改为按时间间隔切换。

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

【讨论】:

    【解决方案2】:

    从 Python 3.2 开始,可以使用 sys.setswitchinterval 调整解释器的线程切换时间间隔:https://docs.python.org/3.6/library/sys.html#sys.setswitchinterval

    在早期版本中,默认情况下,解释器每 100 条虚拟指令检查一次周期性事物,例如线程切换和信号处理程序。这可以通过sys.setcheckinterval修改:https://docs.python.org/2/library/sys.html#sys.setcheckinterval

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2020-12-10
      • 2015-12-07
      相关资源
      最近更新 更多