2016-07-06 4 views
3

У меня есть этот код:Разделив для цикла для каждого процесса

def loop(): 
    alphabet = string.digits + string.letters 
    for key in itertools.product(alphabet, repeat=6): 
    ... 

Я использую 4 процесса, используя этот код:

if __name__ == '__main__': 
    jobs = [] 
    for i in range(4): 
     p = multiprocessing.Process(target=loop) 
     jobs.append(p) 
     p.start() 

Теперь .. это будет просто запустить целую функцию 4 раза , Мне нужно как-то разделить нагрузку на 4 и запустить каждый процесс самостоятельно, поэтому в этом случае мне нужно разделить персонажи, которые я генерирую на 4 разные части. Например:

Обработка процесса 1

100.101.102.103

Процесс 2 нагрузка

104.105.106.107

Процесс 3 нагрузка

108.109.110.111

Процесс 4 нагрузка

112.113.114.115

Я думаю, вы должны понять, что я хочу сделать ..

Я попытался циклически и просто выбросить, но он может получить очень медленно при использовании большой длины символов .. Если бы я имел 1,000,000 линии и процессор имя было 4, оно будет циклически работать 750 000 раз без каких-либо действий и обработать следующие 250 000, если имя процессора было 3 .. он будет цикл 500 000 раз, обработать следующие 250k и завершить на 75000, так много потраченных впустую вычислительной мощности:/

ответ

1

Перед тем, как позвонить Process, необходимо разделить рабочую нагрузку и передать ее вашей функции. Вообще говоря, это может быть сложной проблемой, но в вашем случае это довольно тривиально, поскольку вы просто создаете декартовы продукты - просто срезайте первый символ и присоедините его отдельно.

Т.е. вместо того, чтобы генерировать repeat=6, используйте repeat=5 и перебирайте возможности для первого письма самостоятельно, передавая каждый отдельный процесс.

Например:

def loop(first, sequence): 
    for seq in sequence: 
     key = first + seq 
     .... 

и назвать его:

alphabet = ... 
for letter in alphabet: 
    p = Process(target=loop, args=(letter, itertools.product(alphabet, repeat=5)) 
    # etc. 

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

+0

Спасибо !! собираюсь попробовать сейчас, такое приятное решение .. – x34c4

+0

nevermind..thanks – x34c4

+0

Добро пожаловать! – tzaman

0

Кажется, что для каждой задачи требуется только небольшой объем данных, поэтому попробуйте использовать multiprocessing.Pool для создания a pool of workers. Он запустит пул рабочих процессов и отправит кусок предметов каждому работнику. Используйте что-то вроде imap_unordered, чтобы сопоставить все комбинации ввода с их результатами.

+0

Это требует массивных данных, я думаю .. для ключа в itertools.product (alphabet, repeat = 6): может производить 15 миллионов строк .. и если это 7 .. он доходит до сотен миллионов строк, также я делая расшифровку AES, я не уверен, как «пул».карта "будет работать с этим .. – x34c4

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