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

N_CORES並列プロセスを超えない18プロセス(ファイルごとに1プロセス)を実行したいとします。

最も簡単な方法は、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 に答える