8

我想告诉我的 Python 线程让步,从而避免不必要地占用 CPU。在 Java 中,您可以使用该Thread.yield()函数来做到这一点。我认为 Python 中没有类似的东西,所以我一直在使用time.sleep(t)where t = 0.00001。因为t=0似乎没有效果。

我认为也许我对 Python 的线程模型没有正确理解,因此缺少thread.yield(). 有人可以向我澄清这一点吗?谢谢!

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

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

4

3 回答 3

11

重复:threading.Thread 如何在 Python 中产生剩余的量子?.

time.sleep(0)
于 2009-12-15T15:38:13.440 回答
4

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

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

但是,您想要做的事情在某种意义上似乎存在缺陷 - 如果您有 2 个线程并且它们都有工作要做,那么您不必编写应用程序端代码来在它们之间切换。这是操作系统或虚拟机的工作。如果您发现自己告诉一个线程“少做”,因为您想在处理器时间方面偏爱另一个线程,那么您可能应该设置线程优先级,而不是添加任意的屈服或休眠。(同样,鉴于全局解释器锁的存在,这在 Python 中可能没有太大意义。)

于 2009-12-15T15:43:41.543 回答
0

python 中缺少 Thread.yield() 可能是因为它被遗忘了,或者设计者认为所有同步和进程间通信问题都可以在没有 Thread.yield() 的情况下解决。

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

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

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

于 2016-07-09T09:00:19.160 回答