python并行子进程

python并行子进程,python,subprocess,Python,Subprocess,我试图在Python2.7中以并行方式(每次4个)运行一系列shell命令。注意cmds是代码中其他地方生成的字符串的有效列表。这就是我目前所处的位置 from multiprocessing import Pool import subprocess def worker(cmd): print cmd subprocess.Popen(cmd, shell=true) pool = Pool(4) for cmd in cmds: pool.apply_asy

我试图在Python2.7中以并行方式(每次4个)运行一系列shell命令。注意
cmds
是代码中其他地方生成的字符串的有效列表。这就是我目前所处的位置

from multiprocessing import Pool 
import subprocess

def worker(cmd):
    print cmd 
    subprocess.Popen(cmd, shell=true)

pool = Pool(4)
for cmd in cmds:
    pool.apply_async(worker, [cmd])

从中我既没有得到输出,也没有得到错误。非常感谢您的建议。

您的脚本可能会在进程运行之前结束

我试过你的代码,也遇到了同样的问题。 要解决此问题,您应该关闭池(pool.close())并等待进程结束(pool.join())。 选中此项:

from multiprocessing import Pool
import subprocess

cmds=['str1', 'str2', 'str3', 'str4']

def worker(cmd):
    print cmd
    p = subprocess.Popen(cmd, shell=true)
    p.wait()

pool = Pool(4)
for cmd in cmds:
    pool.apply_async(worker, [cmd])

pool.close()
pool.join()
产出:

str1
str2
str3
str4

您的脚本可能在进程运行之前结束

我试过你的代码,也遇到了同样的问题。 要解决此问题,您应该关闭池(pool.close())并等待进程结束(pool.join())。 选中此项:

from multiprocessing import Pool
import subprocess

cmds=['str1', 'str2', 'str3', 'str4']

def worker(cmd):
    print cmd
    p = subprocess.Popen(cmd, shell=true)
    p.wait()

pool = Pool(4)
for cmd in cmds:
    pool.apply_async(worker, [cmd])

pool.close()
pool.join()
产出:

str1
str2
str3
str4

谢谢脚本不应该在所有进程完成时结束吗?如果我使用您的字符串,我将获得与您相同的输出。奇怪的是,这不适用于我的字符串列表。脚本在结束时结束,所有相关进程都被删除。因此,如果脚本不等待进程结束,它将终止它们。不知道为什么它不适用于您自己的代码,可能还有其他不相关的问题?既然您说过“cmds”是代码中其他地方生成的字符串的有效列表,我就编造了一个。cmd将使用subprocess.call单独执行。我想我只是想澄清为什么脚本会以进程仍然打开的方式结束。好的。我知道发生了什么事。虽然脚本已完成,但进程仍在后台运行。有没有办法让脚本一直打开直到它们全部完成?我的假设是,使用for循环,它将贯穿整个列表(50多个命令)。相反,它只运行与池中线程数量相同的线程(4),然后退出。脚本不应该在所有进程完成时结束吗?如果我使用您的字符串,我将获得与您相同的输出。奇怪的是,这不适用于我的字符串列表。脚本在结束时结束,所有相关进程都被删除。因此,如果脚本不等待进程结束,它将终止它们。不知道为什么它不适用于您自己的代码,可能还有其他不相关的问题?既然您说过“cmds”是代码中其他地方生成的字符串的有效列表,我就编造了一个。cmd将使用subprocess.call单独执行。我想我只是想澄清为什么脚本会以进程仍然打开的方式结束。好的。我知道发生了什么事。虽然脚本已完成,但进程仍在后台运行。有没有办法让脚本一直打开直到它们全部完成?我的假设是,使用for循环,它将贯穿整个列表(50多个命令)。相反,它只运行与池(4)中线程数量相同的线程,然后退出。我对答案进行了修改,采用了python指南()建议的正确方法,从下面的备注中可以看出,您不需要对
[PAR]
-子进程进行
调度,但实际上只是一个
[SEQ]
-时间表,它也会阻塞,以便在下一个
cmd
-在前一个完成后“被炮击”之前等待。这不是一种并行的调度方式,也不是一种遗憾,因为我对编程还很在行。这对我来说有点过头了。目标是同时运行多个进程。这应该被定义为多处理吗?如果您觉得合适,我可以编辑标题和标签。不,先生。进程调度不能解释为“同时”。系统的基本理论知道[串行](或[顺序]一个纯串行计划-一个接一个)或[并发](或者尽你所能,如果资源允许的话-在共享资源可以自由运行列表中的另一个任务后,有些会更快完成)或真正的-[并行]调度——保证所有进程同时启动/执行/完成。CS文献和HPC社区成员在使用术语just concurrent(并发)和/或true Parallel(真正的并行)方面都不是纯粹的主义者。从下面的评论中可以看出,您不需要
[PAR]
-子流程的调度
-输出命令,实际上只需要
[SEQ]
-调度,它也会阻塞,以便在下一个
cmd
-在上一个完成后“被炮击”之前等待。这不是一种并行的调度方式,也不是一种遗憾,因为我对编程还很在行。这对我来说有点过头了。目标是同时运行多个进程。这应该被定义为多处理吗?如果您觉得合适,我可以编辑标题和标签。不,先生。进程调度不能解释为“同时”。系统的基本理论知道[串行](或[顺序]一个纯串行计划-一个接一个)或[并发](或者尽你所能,如果资源允许的话-在共享资源可以自由运行列表中的另一个任务后,有些会更快完成)或真正的-[并行]调度——保证所有进程同时启动/执行/完成。CS文献和HPC社区成员都不是纯粹的使用术语“只是并发和/或真正并行”的人