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
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.
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().
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.
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.