views:

130

answers:

4

Hi,

in python, if i want to keep a process or thread running forever, i can typically do this with an empty while loop:

while 1:
    pass

this, however, will eat an unfair amount of CPU process. Adding a short sleep would work

import time
while 1:
    time.sleep(0.01)

Is there any best and cleaner way of doing this? Thanks

+1  A: 

Don't use busy waiting. Depending on what you are waiting for, use one of the operating system's blocking wait functions, e.g. select on Unix and WaitForSingleObject/WaitForMultipleObjects on Windows.

Philipp
thanks for the answer. though, i'm not waiting for a thing. as the question implies, the process aim is to run _forever_ until it's killed.
pistacchio
+1  A: 

If you are relying on this script to perform periodic maintenance, use cron (UNIX) or scheduled tasks (Windows).

If you wish to wait for subprocesses to complete, use os.waitpid.

If you wish to wait for filesystem activity, use pyinotify.

Ranieri
+1  A: 

What's the issue with sleeping for a very brief period of time? 1 millisecond is close to an eternity to a modern computer. Provided you don't have thousands of these threads (which it sounds like you don't), then there is NOTHING wrong with sleeping for one, ten, ten thousand, or ten million milliseconds every iteration through the loop. The CPU won't even notice this little blip.

San Jacinto
A: 

Given the rather bizarre requirements (a process that goes forever without using much CPU), this is reasonably compact:

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

...however, I fear I am succumbing to the temptation to solve your Y and not your X.

Besides which, this won't work if your platform doesn't provide the threading module. If you try to substitute the dummy_threading module, dummy_event.wait() returns immediately.

Update: if you are just keeping a parent process going for the sake of its subprocesses, you can use the wait()method on Popen objects, or the join() method on Process objects. Both of these methods will block indefinitely until the subprocess ends. If you're using some other subprocess API, there's bound to be equivalent functionality available. If not, get the PID of the process and use os.waitpid().

detly