2010-07-12 181 views
9

在python,如果我想保持一个进程或线程运行永远,我通常可以用空做这个while循环:非阻塞等待

while 1: 
    pass 

这一点,但是,会吃的不公平的CPU进程量。添加一个短暂的睡眠将工作

import time 
while 1: 
    time.sleep(0.01) 

是否有任何最好和更干净的方式做到这一点?谢谢

+0

线程在等待什么?你为什么不做时间睡(1000000)? – Sjoerd 2010-07-12 07:44:15

+0

这是一个类似于服务器的应用程序,所以我希望它等待超过几天(1000000秒)! 理论上,必须运行_forever_的线程必须持续运行的时间要比__非常长的秒数多__ – pistacchio 2010-07-12 07:59:00

+0

除了睡眠或繁忙循环之外,线程是否执行了*任何有用的操作?如果不是,你可以放弃吗?如果它*做了一件有价值的事情,'大概!这就是我们需要知道的帮助你的一点。 – 2010-07-12 09:17:14

回答

7

鉴于相当奇特的要求(即永远不用使用多CPU的过程),这是紧凑合理:

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

...但是,我担心我屈服于诱惑解决您的ÿ而不是你的X.

除此之外,如果你的平台不提供threading模块,这将不起作用。如果您尝试替换dummy_threading模块,则会立即返回dummy_event.wait()

更新:如果你只是保持父进程会为它的子进程的缘故,你可以使用Popen objectswait()方法,或Process对象join()方法。这两种方法都会无限期地阻塞,直到子进程结束。如果您使用其他一些子流程API,则必然会有可用的等效功能。如果没有,请获取进程的PID并使用os.waitpid()

2

不要使用繁忙的等待。根据您所等待的内容,使用操作系统的阻塞等待函数之一,例如在Unix上是select,在Windows上是WaitForSingleObject/WaitForMultipleObjects

+0

感谢您的回答。不过,我并没有等待一件事。正如问题所暗示的那样,这个过程的目标是在被杀之前运行_forever_。 – pistacchio 2010-07-12 09:12:26

1

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

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

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

2

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