Parallel Processing with Bash subprocesses in Python
Executing bash subprocesses in parallel is a common task in scripting and automation. In Python, you can use the subprocess module to spawn new processes, and the threading module to execute them concurrently.
However, the technique described in the first answer to the question linked by the user results in sequential execution of bash processes. To run them in parallel, use the following approaches:
1. Using multiprocessing.dummy.Pool:
For parallel execution with a limited number of concurrent processes, you can use multiprocessing.dummy.Pool. It provides a thread-based interface similar to multiprocessing.Pool.
<code class="python">import multiprocessing.dummy as mp from subprocess import call pool = mp.Pool(2) # Set the maximum number of concurrent commands for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): if returncode != 0: print("%d command failed: %d" % (i, returncode))</code>
2. Using Subprocesses with Manual Concurrency Control:
You can limit the number of concurrent processes without using thread or process pools.
<code class="python">from subprocess import Popen from itertools import islice max_workers = 2 processes = (Popen(cmd, shell=True) for cmd in commands) running_processes = list(islice(processes, max_workers)) while running_processes: # Check for completed processes and start new ones for i, process in enumerate(running_processes): if process.poll() is not None: running_processes[i] = next(processes, None) if running_processes[i] is None: del running_processes[i] break</code>
3. Using Subprocesses with os.waitpid() (Unix-only):
On Unix systems, you can use os.waitpid(-1, 0) to block and wait for any child process to exit. This eliminates the need for a busy loop.
These methods provide flexible options for controlling concurrency in bash subprocesses using Python.
The above is the detailed content of How Can I Execute Bash Subprocesses in Parallel with Python?. For more information, please follow other related articles on the PHP Chinese website!