如何使用线程和子流程模块产生并行bash流程?当我启动线程时,这里的第一个答案是:如何在Python中使用线程?,bash进程按顺序运行,而不是并行运行。
你不需要线程来并行运行子流程:
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',
]
# run in parallel
processes = [Popen(cmd, shell=True) for cmd in commands]
# do other things here..
# wait for completion
for p in processes: p.wait()
为了限制并发命令的数量,可以使用multiprocessing.dummy.Pool
线程并提供与multiprocessing.Pool
使用进程相同的接口:
from functools import partial
from multiprocessing.dummy import Pool
from subprocess import call
pool = Pool(2) # two concurrent commands at a time
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
if returncode != 0:
print("%d command failed: %d" % (i, returncode))
该答案演示了限制并发子进程数的各种技术:它显示了multiprocessing.Pool,concurrent.futures
,线程+基于队列的解决方案。
你可以限制并发子进程的数量,而无需使用线程/进程池:
from subprocess import Popen
from itertools import islice
max_workers = 2 # no more than 2 concurrent processes
processes = (Popen(cmd, shell=True) for cmd in commands)
running_processes = list(islice(processes, max_workers)) # start new processes
while running_processes:
for i, process in enumerate(running_processes):
if process.poll() is not None: # the process has finished
running_processes[i] = next(processes, None) # start new process
if running_processes[i] is None: # no new processes
del running_processes[i]
break
问题内容: 如果我在bash中运行,结果将是两个命令都运行。但是,如果我使用子进程,则将运行第一个命令,打印出该行其余部分的全部内容。下面的代码回显而不是,我如何才能运行两个命令? 问题答案: 您必须在子进程中使用shell = True,而不能使用shlex.split: 返回:
问题内容: 我想在我的shell脚本中引入多线程功能。 我有一个脚本,使用不同的参数调用该函数。这些函数调用中的每一个都是独立的。 可以并行实例化这些函数调用(而不是脚本)。请让我如何实现这一目标。 问题答案: 当然,只需在命令后添加: 所有这些作业将同时在后台运行。然后,可选命令将等待所有作业完成。 每个命令将在单独的进程中运行,因此从技术上讲,它不是“多线程”,但我相信它可以解决您的问题。
问题内容: 我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器。我的并行化非常简单,程序的所有并行“线程”都是独立的,并将其输出写入单独的文件。我不需要线程交换信息,但是必须知道线程何时完成,因为管道的某些步骤取决于它们的输出。 可移植性很重要,因为我希望它可以在Mac,Linux和Windows上的任何Python版本上运行。考虑到这些限制,哪个是实现此功能的最合适的Pyt
问题内容: 我有一个python应用程序,它可以捕获数据集合,并针对该集合中的每个数据执行任务。由于涉及到延迟,因此该任务需要一些时间才能完成。由于这种延迟,我不希望每个数据都随后执行任务,而是希望它们全部并行发生。我应该使用多进程吗?或执行此操作的线程? 我尝试使用线程,但遇到了一些麻烦,通常某些任务实际上不会执行。 问题答案: 如果您确实受到计算的限制,那么使用多处理模块可能是最轻巧的解决方案
我对连接池的理解是;如果connectionstring完全相同,那么我们重用该连接,而不是建立新的连接。 我的问题是,我正在为并行处理创建许多线程。在这个“虚拟”程序中,我创建了500个线程,并让线程池函数处理这些线程。 步骤是: > < li> 每个线程在SQL中创建一个更新表。(说明更新的时间戳) 然后线程Hibernate1到10秒(随机)。 最后,线程在 SQL 中进行另一次更新(说明结
mongols提供的所有服务器设施既可以多线程化也可以多进程化。 并且支持在多进程化的同时多线程化。 来看代码: #include <mongols/util.hpp> #include <mongols/web_server.hpp> #include <sys/prctl.h> #include <sys/signal.h> #include <sys/wait.h> #include <u