在Python中有类似于Java的Thread.yield()的东西吗?这甚至有意义吗?

时间:2009-12-15 15:30:28

标签: python multithreading sleep yield

我想告诉我的Python线程屈服,因此避免不必要地占用CPU。在Java中,您可以使用Thread.yield()函数执行此操作。我不认为Python中有类似的东西,所以我一直在使用time.sleep(t) t = 0.00001。对于t=0,似乎没有效果。

我认为可能有些东西我对Python的线程模型没有正确理解,因此缺少thread.yield()的原因。有人可以向我澄清这个吗?谢谢!

PS:这就是Java Thread.yield()的文档所说的:

  

导致当前正在执行的线程   对象暂时暂停和允许   其他线程要执行。

3 个答案:

答案 0 :(得分:10)

答案 1 :(得分:4)

解释器无论如何都会定期从一个线程切换到另一个线程 - 您不需要告诉系统不要“占用”线程。

但是,在正常情况下,任何时候只执行一个Python线程。 (例外情况往往围绕线程等待来自外部设备(如硬盘或网络)的输入的时间。)这是由Global Interpreter Lock引起的。但这确实意味着您可能没有像在Java或许多其他语言中那样从Python中获得尽可能多的好处。解决这个问题并不一定是微不足道的,尽管如果可能的话,转向multiprocessing而不是多线程是一种很好的方法。

但是,你想要做的事情在某种意义上似乎有缺陷 - 如果你有两个线程并且他们都有工作要做,你就不必编写应用程序端代码来在它们之间切换。这是操作系统或虚拟机的工作。如果你发现自己告诉一个线程“少做”因为你想在处理器时间方面支持另一个线程,那么你应该设置线程优先级,而不是添加任意的让步或休眠。 (尽管同样,考虑到Global Interpreter Lock的存在,这在Python中可能没有多大意义。)

答案 2 :(得分:0)

python中缺少Thread.yield(),因为它可能已被遗忘,或者设计人员认为没有Thread.yield()就可以解决所有同步和进程间通信问题。

我将使用Thread.yield()来解决以下问题:

E.g。有一个作业队列,有2个工作线程可以从作业队列中获取条目并将条目放入作业队列。 解决它的一种方法是使用threading.Condition类。 当worker'B'想要获取队列条目但队列为空时,它进入等待状态(Condition.wait())。当工人'A'进入队列时,它会唤醒工人'B'(Condition.notify())。在这一点上,屈服是必不可少的,因为如果工人'A'在这里没有屈服,工人'A'可以在被唤醒的工人'B'之前取得任务,这会导致竞争条件问题。

我想知道如果没有Thread.yield(),它是如何解决的。