2012-11-09 2 views
2

Эта проблема заставляет меня путатьСмешение на subprocess.Popen

Я просто хочу, чтобы запустить команду 1 на 18 различных входных файлов, так что я написал это как

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 часов весь процесс переходит в спящий режим.

Но если я вызываю команду с терминала вручную (для всех разных файлов), все они были Ок.

Любая помощь была бы оценена.

+0

будет интересно узнать немного больше о процессе называют: как сделайте 'cmd' в конце концов выглядеть? генерировать вывод? требуют ввода? Это работает, если вы только начали 1 процесс? –

+0

@LotharKrause команда cmd запускает другую командную базу (в моем случае я запустил программу, которая называется Crux). Да для одного процесса было нормально, но для 7 одновременных процессов я не знаю, почему он был заморожен. – khikho

ответ

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 
1

Не зная, что должны делать ваши подпроцессы и как долго они должны работать, трудно дать точный ответ здесь.

Некоторые проблемы, которые я вижу с вашей программой:

  • вы проверить i < len(running), а увеличивающиеся я и удаление из running.
    Либо используйте счетчик, либо проверьте, содержит ли список все элементы, но не выполняет оба действия одновременно. Таким образом, вы выйдете из цикла на полпути.
  • вы увеличиваете i каждый раз, когда процесс имеет не завершено, вы, вероятно, хотите увеличить, если процесс имеет закончен.
Смежные вопросы