2014-10-23 4 views
0

Обычно я использую следующий код, и она отлично работает, если вы не имеет значения, в которых функция порядка process_func будет обрабатывать некоторый параметр:Как реализовать пользовательский контроль над многопроцессорной обработкой python.Pool?

params = [1,2,3,4,5 ... ] 

def process_func(): 
    ... 

pool = new Pool(40) 
pool.map(process_func, params) 
pool.close() 
pool.join() 

В приведенном выше примере мы имеем процессы одного типа, с максимальным Simultanious числом 40 Но ... представьте, что у нас есть процессы (параметры) различного типа, которые должны выполняться одновременно. Например, в моей сетке селена у меня 40 firefox, 40 хром. И у меня 5000 тестовых примеров, некоторые из них предпочитают хром, некоторые из них - firefox, некоторые из них не имеют значения.

Например, предположим, что мы имеем следующие типы:

  • типа FireFox: максимальное Simultanious число: 40
  • типа хром: максимальное Simultanious число: 40

В этом случае наш бассейн будет иметь максимум 80 одновременных процессов, но существует строгое правило: 40 из них должны быть firefox, 40 из них должны быть хромами.

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

Как это можно достичь?

+1

Есть ли причина не просто использовать два пула и два списка входов? –

ответ

2

Я бы изменил ваш process_func(), чтобы принять еще один параметр, который сообщает ему, что «тип» должен быть и использовать два отдельных пула. Добавление functools.partial позволит нам по-прежнему использовать pool.map():

from functools import partial 
from multiprocessing import Pool 

params = [1,2,3,4,5 ... ] 

def process_func(type, param): 
    if type == 'Firefox': 
     # do Firefox stuff 
    else: 
     # do Chrome stuff 

chrome_pool = Pool(40) 
fox_pool = Pool(40) 

chrome_function = partial(process_func, 'Chrome') 
fox_function = partial(process_func, 'Firefox') 

chrome_pool.map(chrome_func, params) 
fox_pool.map(fox_func, params) 

chrome_pool.close() 
fox_pool.close() 
chrome_pool.join() 
fox_pool.join() 

functools.partial() функция позволяет связать аргумент к определенному значению, возвращая новый функциональный объект, который всегда будет поставлять этот аргумент. Этот подход позволяет вам ограничить каждый «тип» (из-за отсутствия лучшего термина) до 40 рабочих процессов.

+0

Хм, ничего себе, и эти два бассейна будут работать синхронно в одном мастер-процессе? – avasin

+0

Хм ... и как я могу контролировать тесты, у которых нет предпочтительного типа (браузера)? Фактически, они должны использовать менее загруженный тип браузера. – avasin

+0

Я не уверен, что вы подразумеваете под «одним мастер-процессом», но это почти то же самое, что и вызов «Пул (80)». Вы просто применяете ограничение количества рабочих, доступных для каждой функции, использующей определенный браузер. – skrrgwasme

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