gpt4 book ai didi

python - python如何处理线程锁定/上下文切换?

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:51 25 4
gpt4 key购买 nike

我观看了关于 GIL 的精彩演示,以及在解释器中运行时如何一次只能运行 1 个线程。似乎python在线程之间的切换方面也不是很智能。

如果我正在线程化一些只在解释器中运行的操作,并且它不是特别重的 CPU,并且我使用线程锁,对于这个相对较短的解释器绑定(bind)操作,一次只能运行 1 个线程,那会不会锁实际上让任何东西运行得更慢?而不是如果不需要锁并且所有线程都可以同时运行。

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

编辑:通过“让事情运行得更慢”我的意思是如果 python 是上下文切换到一堆锁定的线程,那将(可能)是性能下降,即使线程实际上没有运行

最佳答案

Larry Hastings(核心 CPython 开发人员)有一个很棒的演讲,涵盖了名为“Python's Infamous GIL”的主题。如果您跳到 11:40ish,他会回答您的问题。

来自演讲:Python 线程与 GIL 一起工作的方式是使用一个简单的计数器。每执行 100 字节代码,GIL 应该由当前执行的线程释放,以便让其他线程有机会执行代码。由于线程释放/获取机制,这种行为在 Python 2.7 中基本上被打破了。它已在 Python 3 中修复。

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

如果您有多个线程,并且由于锁的缘故一次只能运行 1 个线程,那么理论上您的程序将需要更长的时间来执行。在实践中,您应该进行基准测试,因为结果会让您大吃一惊。

关于python - python如何处理线程锁定/上下文切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33352298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com