Python中有类似Java的Thread.yield()的方法吗?这有意义吗?
我想让我的Python线程让出一些时间,这样就不会不必要地占用CPU。在Java中,你可以用Thread.yield()
这个函数来做到这一点。但我觉得Python里没有类似的东西,所以我一直在用time.sleep(t)
,其中t = 0.00001
。如果t=0
,似乎没有任何效果。
我觉得我可能对Python的线程模型理解得不太对,所以才找不到thread.yield()
这个东西。有人能给我解释一下吗?谢谢!
附注:这是Java的Thread.yield()
文档中说的内容:
使当前正在执行的线程对象暂时暂停,并允许其他线程执行。
3 个回答
在Python中没有Thread.yield()这个方法,可能是因为设计者忘记了,或者觉得所有的同步和进程间通信问题都可以在没有Thread.yield()的情况下解决。
我会在以下问题中使用Thread.yield():
比如,有一个工作队列和两个工作线程,它们可以从工作队列中取任务,也可以把任务放入工作队列中。有一种解决方法是使用threading.Condition类。
当工作线程'B'想要从队列中取任务,但队列是空的,它就会进入等待状态(Condition.wait())。当工作线程'A'把任务放入队列时,它会唤醒工作线程'B'(Condition.notify())。在这个时候,线程让出控制权是很重要的,因为如果线程'A'不让出控制权,它可能会在被唤醒的线程'B'之前取到任务,这样就会出现竞争条件的问题。
我想知道没有Thread.yield()的话,这个问题怎么解决。
重复的问题:在Python中,threading.Thread是如何让出它的剩余时间片的?。
time.sleep(0)
解释器会定期在不同的线程之间切换,你不需要去干预,也就是说不需要告诉系统不要“占用”某个线程。
不过,通常情况下,在任何时刻只有一个Python线程在执行。(例外情况是当线程在等待外部设备的输入,比如硬盘或网络时。)这主要是因为有一个叫做全局解释器锁的机制。这也意味着,在Python中使用线程的好处可能没有在Java或其他很多语言中那么明显。解决这个问题并不简单,不过如果可以的话,使用多进程而不是多线程是一个不错的选择。
不过,你想做的事情在某种程度上是有问题的——如果你有两个线程,它们都有工作要做,你不应该需要在应用程序中写代码去切换它们。这应该是操作系统或虚拟机的工作。如果你发现自己在告诉一个线程“少做点”,因为你想让另一个线程在处理器时间上更有优势,那么与其随意让线程“让步”或“休眠”,你可能更应该设置线程的优先级。(不过,再说一次,由于全局解释器锁的存在,这在Python中可能意义不大。)