首页 >后端开发 >Python教程 >如何在Python中有效管理和控制并行bash子进程的并发?

如何在Python中有效管理和控制并行bash子进程的并发?

DDD
DDD原创
2024-10-30 04:37:02464浏览

How to effectively manage and control the concurrency of parallel bash subprocesses in Python?

使用 Python 并行 Bash 子进程:综合指南

有效地利用 Python 线程和子进程模块可以帮助您同时执行多个 bash 进程。然而,简单地使用线程创建线程可能无法实现所需的并行性。

没有线程的并发进程管理

并发运行 bash 进程的一个直接方法是避免使用线程共。使用 subprocess.Popen 实用程序,您可以直接并行调用多个命令,如下所示:

<code class="python">from subprocess import Popen

commands = [
    'date; ls -l; sleep 1; date',
    'date; sleep 5; date',
    'date; df -h; sleep 3; date',
    'date; hostname; sleep 2; date',
    'date; uname -a; date',
]
# Execute commands concurrently
processes = [Popen(cmd, shell=True) for cmd in commands]</code>

通过多处理控制并发

如果需要限制并发进程的数量,您可以使用 multiprocessing.dummy.Pool,它提供了类似于 multiprocessing.Pool 的基于线程的接口。以下代码说明了这种方法:

<code class="python">from functools import partial
from multiprocessing.dummy import Pool
from subprocess import call

pool = Pool(2) # Limit to 2 concurrent processes
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
       print("%d command failed: %d" % (i, returncode))</code>

非阻塞子进程管理

或者,您可以限制并发子进程,而无需求助于线程或进程池。下面的代码演示了这种策略:

<code class="python">from subprocess import Popen
from itertools import islice

max_workers = 2  # Maximum number of concurrent processes
processes = (Popen(cmd, shell=True) for cmd in commands)
running_processes = list(islice(processes, max_workers))  # Start initial processes

while running_processes:
    for i, process in enumerate(running_processes):
        if process.poll() is not None:  # Process has completed
            running_processes[i] = next(processes, None)  # Start new process
            if running_processes[i] is None: # No new processes
                del running_processes[i]
                break</code>

对于 Unix 系统,请考虑使用 os.waitpid(-1, 0) 来避免繁忙循环并等待任何子进程终止。

以上是如何在Python中有效管理和控制并行bash子进程的并发?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn