【问题标题】:Python Subprocess wait for a list of subprocess [duplicate]Python子进程等待子进程列表[重复]
【发布时间】:2017-12-20 05:40:27
【问题描述】:

我正在使用 python3 子进程模块来处理 bash 脚本调用。我想在调用脚本时控制并发子进程的数量。

Popen.wait(超时=无) 等待子进程终止。设置并返回返回码属性。

我知道我可以调用 subprocess.Popen.wait(timeout=None) 来等待子进程终止。但是我想知道是否可以等待 subprocess.Popen 列表完成,这样我就可以控制并发进程的数量。

示例代码sn-ps如下:

例子.py

import subprocess
from itertools import zip_longest

seed = [1, 2, 4, 1, 3, 5, 4, 1]
basepath="/path/to/file/hello.sh"

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

def bash_handler(num):
    return subprocess.Popen('bash {0} {1}'.format(basepath, num), shell=True)

for bulk in grouper(seed, 2):
    [bash_handler(item).wait() for item in bulk if item is not None]
# This will executed one by one 

你好.sh

# Validation goes here.
echo $1
sleep $1
echo "Finish Executed"

【问题讨论】:

  • 你可以使用communicate()
  • @MaheshKaria 不知道如何使用它。任何帮助或有用的线程?
  • 糟糕,我并不是真的要关闭为重复项(没有意识到这也被标记为bash)。如果当前的副本不能解决您的问题,或者至少寻找不同的副本,我会很乐意重新打开。

标签: python bash concurrency subprocess


【解决方案1】:

当你使用communicate()时,你不需要指定等待子进程退出。更多信息可以在这里找到https://docs.python.org/2/library/subprocess.html 其他链接 Understanding Popen.communicate

以下更改应该适合您

from subprocess import Popen,PIPE
def bash_handler(num):
    return subprocess.Popen('bash {0} {1}'.format(basepath, num), shell=True,stdout=PIPE)


for bulk in grouper(seed, 2):
    [bash_handler(item).communicate() for item in bulk if item is not None]

【讨论】:

  • 运行bashshell=True 是......古怪。另见stackoverflow.com/questions/3172470/…
  • @pankaj mishra 请注意,我希望bulk 中的子进程同时运行。有什么办法可以做到这一点?还是我只需要切换到多处理模块?
  • @tripleee 可能是回答这个问题的合适人选
  • Popen 默认运行单独的进程,如果您不需要专门针对它们使用communicate(),它们基本上会在后台运行。使用subprocess.poll() 无阻塞地检查状态。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2016-03-07
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多