У меня есть скрипт python, который одновременно случайным образом обрабатывает массивы и изображения numpy. Чтобы иметь правильную случайность внутри порожденных процессов, я передаю случайное семя из основного процесса рабочим для их заполнения.
Когда я использую maxtasksperchild
для Pool
, мой скрипт зависает после запуска Pool.map
несколько раз.
Ниже приведен минимальный фрагмент, который воспроизводит проблему:
# This code stops after multiprocessing.Pool workers are replaced one single time.
# They are replaced due to maxtasksperchild parameter to Pool
from multiprocessing import Pool
import numpy as np
def worker(n):
# Removing np.random.seed solves the issue
np.random.seed(1) #any seed value
return 1234 # trivial return value
# Removing maxtasksperchild solves the issue
ppool = Pool(20 , maxtasksperchild=5)
i=0
while True:
i += 1
# Removing np.random.randint(10) or taking it out of the loop solves the issue
rand = np.random.randint(10)
l = [3] # trivial input to ppool.map
result = ppool.map(worker, l)
print i,result[0]
это результат
1 1234 2 1234 3 1234 . . . 99 1234 100 1234 # at this point workers should've reached maxtasksperchild tasks 101 1234 102 1234 103 1234 104 1234 105 1234 106 1234 107 1234 108 1234 109 1234 110 1234
потом зависает на неопределенный срок.
Я потенциально мог бы заменить numpy.random
на random
Python и избавиться от проблемы. Однако в моем реальном приложении рабочий процесс будет выполнять пользовательский код (предоставленный в качестве аргумента рабочему процессу), над которым я не контролирую, и хотел бы разрешить использование numpy.random
функций в этом пользовательском коде. Поэтому я намеренно хочу засеять глобальный генератор случайных чисел (для каждого процесса независимо).
Это было протестировано с Python 2.7.10, numpy 1.11.0, 1.12.0 и 1.13.0, Ubuntu и OSX.