2014-01-07 2 views
1

Я хочу запустить несколько процессов в цикле, но, поскольку они довольно долго заканчиваются, я думал, что лучше запустить их параллельно. Все эти процессы независимы, т. Е. Они не зависят от результата друг друга. Вот небольшой пример, который иллюстрирует тип цикла я имею дело с:Параллельные независимые процессы

inDir = '/path/to/your/dir/' 
inTxtList = ['a.txt','b.txt','c.txt','d.txt','e.txt'] 
for i in inTxtList: 
    myfile = open(i,'w') 
    myfile.write("This is a text file written in python\n") 
    myfile.close() 

Я попытался multiprocessing пакет и придумать следующий код:

import multiprocessing 

def worker(num): 
    """thread worker function""" 
    myfile = open(num,'w') 
    myfile.write("This is my first text file written in python\n") 
    myfile.close() 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in inTxtList: 
     p = multiprocessing.Process(target=worker, args=(inDir+i,)) 
     jobs.append(p) 
     p.start() 
     p.join() 

Это на самом деле работает но я не знаю, как установить количество рабочих. Не могли бы вы мне помочь?

ответ

3

multiprocessing.Pool.map. Вы можете указать количество рабочих, указав processes аргумент при создании Pool объекта:

import os 
import multiprocessing 

def worker(num): 
    with open(num, 'w') as f: 
     f.write("This is my first text file written in python\n") 

if __name__ == '__main__': 
    number_of_workers = 4 
    pool = multiprocessing.Pool(processes=number_of_workers) 
    pool.map(worker, [os.path.join(inDir, i) for i in inTxtList]) 
    pool.close() 
    pool.join() 

Кстати, использовать os.path.join вместо того, чтобы вручную конкатенировать компоненты пути.

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