从python池手动启动进程

时间:2015-03-04 08:51:03

标签: python multiprocessing

我设法创建了一个池,限制它一次只运行2个进程。

process_pool = Pool(2)
commands = []
for (dirpath, dir, file) in os.walk("files"):
    for name in file:
        command = "python process.py {0}".format(name)
        commands.append(command)

for i, returncode in enumerate(process_pool.imap(partial(call, shell=False), commands)):
   if returncode != 0:
      print("command {0} failed".format(i))


def check_limit():
    pgrep = subprocess.Popen("pgrep subprocess".split(), stdout=subprocess.PIPE, shell=False)
    wc = subprocess.Popen("wc -l".split(), stdin=pgrep.stdout, stdout=subprocess.PIPE, shell=False)
    return wc.communicate()[0]

这一切都是自动完成的,当流程终止时,新的流程就会在他的位置启动。有没有办法手动控制它们?

处理二进制文件最多可生成20个子进程,每个进程限制350MB RAM,每台机器限制60个子进程。当所有子进程终止时,父进程终止,然后池启动另一个父进程 - 在这种情况下,这不是最佳解决方案。由于子进程是异步的,其中一些可能会早于其他进程终止,我想启动另一个父进程,以便它可以开始生成新的子进程。 它可能看起来像这样。

start process
if subprocesses < 60
    start process
else 
    wait 10 secs

这是在bash中完成的事情。

for i in `ls -1 $PATH/*xml`; do
    COMMAND="${BINPATH} ${i}"
    if [ $BACKGROUND -eq 1 ]; then
        check_limit
        $COMMAND >> $LogFile 2>&1 &

    PIDLIST="$! ${PIDLIST}"
done
pwait ${PIDLIST} >& /dev/null

是否有任何方法可以实现这一点,也许Pool不是最好的解决方案,我应该使用Queue?

1 个答案:

答案 0 :(得分:0)

堆栈溢出有时像橡皮鸭一样,在等待帮助时我自己解决了这个问题。只需删除等待subprocess.Popen结果并将其包含在while循环中

command_counter = 0
while True:
    file = open(INPUT_FILE)
    if check_child_processes() < 60 and command_counter < len(commands_list):
        subprocess.Popen(commands_list[command_counter].split(), shell=False, stdin=file)
        command_counter += 1
    time.sleep(1)
    if check_parent_processes() == 0:
        break

无论如何,谢谢你的帮助。