С опозданием с ответом, но вы ломаете голову, устанавливая для random.seed
функцию значение int
.Вместо этого вы должны сделать:
random.seed(2018)
последние несколько строк трассировки обеспечивают контекст, который должен был сделать это очевидным:
File "/usr/lib64/python2.7/multiprocessing/process.py", line 130, in start
self._popen = Popen(self)
File "/usr/lib64/python2.7/multiprocessing/forking.py", line 125, in __init__
random.seed()
TypeError: 'int' object is not callable
это заставляет Pool
продолжать пытаться создатьновые рабочие процессы, но так как это происходит каждый раз, когда невозможно продвинуться вперед.
За этим стоит то, что multiprocessing
знает, что он должен повторно заполнить случайный модуль при разветвлении, чтобы дочерние процессы не разделялито же состояние RNG.Для этого он пытается вызвать функцию random.seed
, но вы установили для нее значение int
, которое не вызывается - отсюда и ошибка!
Другая проблема, связанная с этим, заключается в том, что multiprocessing
не знает, чтобы заново заполнить NumPy RNG, поэтому следующий код:
from multiprocessing import Pool
import numpy as np
def test(i):
print(i, np.random.rand())
with Pool(4) as pool:
pool.map(test, range(4))
заставит каждого работника печатать одно и то же значение. Эта проблема известна давно, но все еще остается открытой.Вы можете обойти это, используя рабочий initializer
, например:
def initfn():
np.random.seed()
with Pool(4, initializer=initfn) as pool:
pool.map(test, range(4))
теперь заставит вышеуказанную функцию test
печатать различные значения.Обратите внимание, что вы даже можете использовать Pool(4, initializer=np.random.seed)
, если не выполняете никакой другой инициализации рабочего уровня.