2

这个问题让我很困惑

我只想在 18 个不同的输入文件上运行 1 个命令,所以我把它写成了

while filenames or running:
  while filenames and len(running) < N_CORES:
    filename = filenames.pop(0)
    print 'Submiting process for %s' % filename
    cmd = COMMAND % dict(filename=filename, localdir=localdir)
    p = subprocess.Popen(cmd, shell=True)
    print 'running:', cmd
    running.append((cmd, p))

  i = 0
  while i < len(running):
    (cmd, p) = running[i]
    ret = p.poll()
    if ret is not None:
        rep = open('Crux.report.%d' % (report_number), 'w')
        rep.write('Command: %s' % cmd)
        print localdir
        print 'done!' 
        report_number += 1
        running.remove((cmd, p))
    else:
        i += 1
  time.sleep(1)

但是当我在 3 小时后运行它时,所有进程都进入了睡眠模式。

但是,如果我手动从终端调用命令(对于所有不同的文件),它们都正常。

任何帮助将不胜感激。

4

2 回答 2

2

我假设您要运行 18 个进程(每个文件一个进程),并且不超过N_CORES并行进程。

最简单的方法可能是在multiprocessing.Pool这里使用:

import multiprocessing as mp
import subprocess

def process_file(filename):
    try:
        return filename, subprocess.call([cmd, filename], cwd=localdir)
    except OSError:
        return filename, None # failed to start subprocess

if __name__ == "__main__":
    pool = mp.Pool()
    for result in pool.imap_unordered(process_file, filenames):
        # report result here
于 2012-11-09T19:46:41.017 回答
1

在不知道您的子流程应该做什么以及它们应该运行多长时间的情况下,很难在这里给出准确的答案。

我在您的程序中看到的一些问题:

  • 您检查i < len(running), 同时增加 i 并从中删除running.
    要么使用计数器,要么检查列表是否仍然包含元素,但不要同时执行这两项操作。这样,您将在中途跳出循环。
  • i每次流程完成时递增,如果流程完成,您可能希望递增。
于 2012-11-09T16:23:41.930 回答