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

2024-10-02 00:32:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果我正在为一些只在解释器中运行的操作线程化,并且它不是特别占用CPU,并且我使用一个线程锁,一次只能运行一个线程来执行这个相对较短的解释器绑定操作,那么这个锁会使任何操作运行得更慢吗?相反,如果不需要锁并且所有线程都可以并发运行。在

如果只有1个线程被锁定,python解释器会知道不切换上下文吗?在

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


Tags: 编辑cpu性能事情线程解释器gil精彩
2条回答

拉里·黑斯廷斯(CPython的核心开发人员)有一篇关于这个主题的精彩演讲,叫做“Python's Infamous GIL”。如果你跳到11:40,他会回答你的问题。在

谈话中提到:Python线程与GIL的工作方式是使用一个简单的计数器。每执行100字节代码,GIL就应该由当前执行的线程释放,以便给其他线程一个执行代码的机会。在Python2.7中,由于线程释放/获取机制,这种行为基本上被破坏了。它已经在python3中修复了。在

使用线程锁时,Python只执行未锁定的线程。因此,如果您有多个线程共享一个锁,那么只有一个线程将同时执行。Python不会开始执行锁定的执行绪,除非执行绪可以取得锁定。锁在那里,这样你就可以在线程之间共享状态而不引入bug。在

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

python is not very intelligent about switching between threads

Python线程以某种方式工作:-)

if I use a thread lock where only 1 thread can run at a time... will that lock actually make anything run slower

呃,没有,因为没有其他可运行的,所以没有其他可以运行得更慢的。在

If all but 1 threads are locked, will the python interpreter know not to context switch?

是的。内核知道哪些线程是可运行的。如果没有其他线程可以运行,那么从逻辑上讲(就线程而言),python解释器不会从唯一可运行的线程上切换上下文。线程不知道它何时被调离(怎么可能,它没有运行)。在

相关问题 更多 >

    热门问题