2014-01-02 3 views
33

У меня есть Python код:Использование multiprocessing.Process с максимальным числом одновременных процессов

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    for i in range(0, MAX_PROCESSES): 
     p = Process(target=f, args=(i,)) 
     p.start() 

, который хорошо работает. Однако MAX_PROCESSES является переменной и может быть любым значением между 1 и 512. Поскольку я выполняю этот код только на машине с ядрами 8, мне нужно выяснить, возможно ли ограничить количество процессов, разрешенных для запуска в одно и то же время. Я просмотрел multiprocessing.Queue, но это не похоже на то, что мне нужно - или, может быть, я неправильно интерпретирую документы.

Есть ли способ ограничить количество одновременных multiprocessing.Process?

+0

для г в интервале (0, мин (MAX_PROCESSES, 8)): – Jacob

+0

@Jacob Я все еще хочу, чтобы все MAX_PROCESSES в бегите хотя. Вышеприведенный код усечен для простоты, но основная функция вызывается до 512 раз (отсюда и цикл). Поэтому мне интересно, есть ли способ обработки очереди. – Brett

+2

, так что вы хотите установить мастер/работник, и хотите ограничить число рабочих? – Jacob

ответ

52

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

Пример из стандартных документации (http://docs.python.org/2/library/multiprocessing.html#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]" 

И это также удобно, чтобы знать, что есть multiprocessing.cpu_count() метод для подсчета количества ядер на данной системе, если это необходимо в вашем коде.

Edit: Вот некоторые проект кодекса, который, кажется, работает для вашего конкретного случая:

import multiprocessing 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    pool = multiprocessing.Pool() #use all available cores, otherwise specify the number you want as an argument 
    for i in xrange(0, 512): 
     pool.apply_async(f, args=(i,)) 
    pool.close() 
    pool.join() 
+0

Это выглядит многообещающе. Я попытаюсь приспособить логику к моему коду, и я отправлю/вернусь сюда, когда буду работать. – Brett

+0

Хорошо, я разработал версию, которая, кажется, отлично подходит для вашего конкретного случая и добавлена ​​в сообщение выше. – treddy

+16

'multiprocessing.cpu_count() - 1 или 1' может быть полезной эвристикой для определения того, сколько процессов будет выполняться параллельно: -1 избегает блокировки системы путем монополизации всех ядер, но если имеется только один доступный CPU, 'или' дает изящный откат одноядерному запуску. – andybuckley

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