Python中有类似Java的Thread.yield()的方法吗?这有意义吗?

9 投票
3 回答
9201 浏览
提问于 2025-04-15 17:03

我想让我的Python线程让出一些时间,这样就不会不必要地占用CPU。在Java中,你可以用Thread.yield()这个函数来做到这一点。但我觉得Python里没有类似的东西,所以我一直在用time.sleep(t),其中t = 0.00001。如果t=0,似乎没有任何效果。

我觉得我可能对Python的线程模型理解得不太对,所以才找不到thread.yield()这个东西。有人能给我解释一下吗?谢谢!

附注:这是Java的Thread.yield()文档中说的内容:

使当前正在执行的线程对象暂时暂停,并允许其他线程执行。

3 个回答

0

在Python中没有Thread.yield()这个方法,可能是因为设计者忘记了,或者觉得所有的同步和进程间通信问题都可以在没有Thread.yield()的情况下解决。

我会在以下问题中使用Thread.yield():

比如,有一个工作队列和两个工作线程,它们可以从工作队列中取任务,也可以把任务放入工作队列中。有一种解决方法是使用threading.Condition类。

当工作线程'B'想要从队列中取任务,但队列是空的,它就会进入等待状态(Condition.wait())。当工作线程'A'把任务放入队列时,它会唤醒工作线程'B'(Condition.notify())。在这个时候,线程让出控制权是很重要的,因为如果线程'A'不让出控制权,它可能会在被唤醒的线程'B'之前取到任务,这样就会出现竞争条件的问题。

我想知道没有Thread.yield()的话,这个问题怎么解决。

5

解释器会定期在不同的线程之间切换,你不需要去干预,也就是说不需要告诉系统不要“占用”某个线程。

不过,通常情况下,在任何时刻只有一个Python线程在执行。(例外情况是当线程在等待外部设备的输入,比如硬盘或网络时。)这主要是因为有一个叫做全局解释器锁的机制。这也意味着,在Python中使用线程的好处可能没有在Java或其他很多语言中那么明显。解决这个问题并不简单,不过如果可以的话,使用多进程而不是多线程是一个不错的选择。

不过,你想做的事情在某种程度上是有问题的——如果你有两个线程,它们都有工作要做,你不应该需要在应用程序中写代码去切换它们。这应该是操作系统或虚拟机的工作。如果你发现自己在告诉一个线程“少做点”,因为你想让另一个线程在处理器时间上更有优势,那么与其随意让线程“让步”或“休眠”,你可能更应该设置线程的优先级。(不过,再说一次,由于全局解释器锁的存在,这在Python中可能意义不大。)

撰写回答