我观看了关于GIL的精彩演示,以及在解释器中运行时,一次只能运行1个单线程。对于线程之间的切换,python似乎也不是很聪明。
如果我正在线程化一些仅在解释器中运行的操作,并且它不是特别重CPU,并且我使用一个线程锁,其中一次只能运行一个线程用于这个相对较短的解释器绑定操作,那么锁实际上让任何东西运行得慢?而不是如果没有必要的锁,并且所有线程可以同时运行。
如果只有1个线程被锁定,那么python解释器是否会知道上下文切换?
编辑: 通过'让事情变慢'我的意思是如果python是上下文切换到一堆锁定的线程,即使线程实际上没有运行也会(可能)性能下降
答案 0 :(得分:5)
Larry Hastings(核心CPython开发人员)有一个很棒的演讲,涵盖了这个名为“Python's Infamous GIL”的主题。如果你跳到11:40,他会回答你的问题。
从谈话中:Python线程与GIL协同工作的方式是一个简单的计数器。执行每100个字节代码时,GIL应该由当前正在执行的线程释放,以便为其他线程提供执行代码的机会。由于线程释放/获取机制,在Python 2.7中基本上破坏了这种行为。它已在Python 3中修复。
当您使用线程锁时,Python将只执行未锁定的线程。因此,如果您有多个线程共享1个锁,那么只有一个线程将同时执行。在线程可以获取锁之前,Python不会开始执行锁定的线程。锁是存在的,因此您可以在线程之间共享状态而不会引入错误。
如果您有多个线程,并且由于锁定,一次只能运行1个,那么理论上您的程序将需要更长的时间来执行。在实践中你应该进行基准测试,因为结果会让你感到惊讶。
答案 1 :(得分:2)
python在线程之间切换不是很聪明
Python线程以某种方式工作: - )
如果我使用一个线程锁,其中一次只能运行一个线程...该锁实际上会使任何运行速度变慢
呃,不,因为没有其他东西可以运行,所以没有别的东西可以运行得更慢。
如果只有1个线程被锁定,那么python解释器是否会知道上下文切换?
是。内核知道哪些线程可以运行。如果没有其他线程可以运行,那么逻辑上讲(就线程而言)python解释器不会从唯一可运行的线程切换上下文。线程不知道什么时候被切断了(怎么可能,它没有运行)。