2013-09-29 4 views
4

Я использую модуль многопроцессорности python для запуска одиночного процесса на нескольких ядрах, но я хочу параллельно запустить пару независимых процессов. Для ex - Process one анализирует большой файл, обрабатывает два шаблона поиска в разных файлах, а процесс 3 выполняет некоторые вычисления; могут ли выполняться параллельно все три разных обработанных файла с разными параметрами?Выполнять отдельные процессы параллельно - Python

def Process1(largefile): 
    Parse large file 
    runtime 2hrs 
    return parsed_file 

def Process2(bigfile) 
    Find pattern in big file 
    runtime 2.5 hrs 
    return pattern 

def Process3(integer) 
    Do astronomical calculation 
    Run time 2.25 hrs 
    return calculation_results 

def FinalProcess(parsed,pattern,calc_results): 
    Do analysis 
    Runtime 10 min 
    return final_results 

def main(): 
parsed = Process1(largefile) 
pattern = Process2(bigfile) 
calc_res = Process3(integer) 
Final = FinalProcess(parsed,pattern,calc_res) 

if __name__ == __main__: 
    main() 
    sys.exit() 

В приведенном выше коде псевды Process1, Process2 и одиночный процессе 3 основной процесс они не то есть могут работать на нескольких процессорах. Эти процессы запускаются последовательно и принимают 2 + 2,5 + 2,25 часа = 6,75 часа. Можно ли параллельно запускать эти три процесса? Чтобы они работали одновременно на разных процессорах/ядрах, и когда большая часть времени (Process2) заканчивается, мы переходим к Final Process.

Я был бы очень признателен за вашу помощь.

AK

+0

Я не понимаю. Пожалуйста, объясни. – Veedrac

+0

Вы посмотрели на модуль 'subprocess'? –

+0

Возможно, вы захотите создать либо [поток] (http://docs.python.org/2/library/threading.html), либо [дочерний процесс] (http://docs.python.org/2/ library /subprocess.html) для обработки данных. –

ответ

14

От 16.6.1.5. Using a pool of workers:

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    pool = Pool(processes=4)    # start 4 worker processes 
    result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously 
    print result.get(timeout=1)   # prints "100" unless your computer is *very* slow 
    print pool.map(f, range(10))   # prints "[0, 1, 4,..., 81]" 

Вы можете, таким образом, apply_async против пула и получить результаты после того, как все будет готово.

from multiprocessing import Pool 

# all your methods declarations above go here 
# (...) 

def main(): 
    pool = Pool(processes=3) 
    parsed = pool.apply_async(Process1, [largefile]) 
    pattern = pool.apply_async(Process2, [bigfile]) 
    calc_res = pool.apply_async(Process3, [integer]) 

    pool.close() 
    pool.join() 

    final = FinalProcess(parsed.get(), pattern.get(), calc_res.get()) 

# your __main__ handler goes here 
# (...) 
+0

Большое спасибо. Я проверю это и опубликую здесь. – Bade

Смежные вопросы