2010-07-12 176 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甚至不會注意到這個小點。