I understand using subprocess is the preferred way of calling external command.
But what if I want to run several commands in parall, but limit the number of processes being spawned? What bothers me is that I can’t block the subprocesses. For example, if I call
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile)
Then the process will continue, without waiting for cmd to finish. Therefore, I can’t wrap it up in a worker of multiprocessing library.
For example, if I do:
def worker(cmd):
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile);
pool = Pool( processes = 10 );
results =[pool.apply_async(worker, [cmd]) for cmd in cmd_list];
ans = [res.get() for res in results];
then each worker will finish and return after spawning a subprocess. So I can’t really limit the number of processes generated by subprocess by using Pool.
What’s the proper way of limiting the number of subprocesses?
You can use
subprocess.callif you want to wait for the command to complete. Seepydoc subprocessfor more information.You could also call the
Popen.waitmethod in your worker:Because there seems to be some confusion about this answer, here’s a complete example:
If you run the above code, you will see that all of the
workerprocesses start in parallel and that we are able to gather values as they are completed.