在python中无阻塞等待

时间:2010-07-12 07:41:22

标签: python multithreading

在python中,如果我想保持一个进程或线程永远,我通常可以使用空的while循环执行此操作:

while 1:
    pass
但是,这会占用不公平的CPU进程。添加短暂的睡眠会起作用

import time
while 1:
    time.sleep(0.01)

有没有最好,更清洁的方法呢?感谢

4 个答案:

答案 0 :(得分:8)

考虑到相当奇怪的要求(这个过程永远不会占用太多CPU),这是相当紧凑的:

import threading
dummy_event = threading.Event()
dummy_event.wait() 

...但是,我担心我会屈服于解决你的Y而不是你的X的诱惑。

除此之外,如果您的平台未提供threading模块,则无法使用此功能。如果您尝试替换dummy_threading模块,dummy_event.wait()会立即返回。

更新:如果您只是为了子进程而保留父进程,则可以使用wait()上的Popen objects方法或{{3 join()个对象上的方法。这两种方法都将无限期地阻塞,直到子进程结束。如果您正在使用其他一些子进程API,那么必然会有相同的功能。如果没有,请获取流程的PID并使用Process

答案 1 :(得分:2)

请勿使用忙碌的等待。根据您正在等待的内容,使用操作系统的阻塞等待功能之一,例如, Unix上为select,Windows上为WaitForSingleObject / WaitForMultipleObjects

答案 2 :(得分:2)

在很短的时间内睡觉有什么问题? 1毫秒接近现代计算机的永恒。如果你没有成千上万的这些线程(听起来你没有这样做),那么在循环中每次迭代睡眠一,十,一万或一千万毫秒都没有错。 CPU甚至都不会注意到这一点。

答案 3 :(得分:1)

如果您依赖此脚本执行定期维护,请使用cron(UNIX)或计划任务(Windows)。

如果您希望等待子流程完成,请使用os.waitpid

如果您希望等待文件系统活动,请使用pyinotify