При использовании multiprocessing.Pool в python со следующим кодом существует несколько причудливых действий.
from multiprocessing import Pool
p = Pool(3)
def f(x): return x
threads = [p.apply_async(f, [i]) for i in range(20)]
for t in threads:
try: print(t.get(timeout=1))
except Exception: pass
Я получаю следующую ошибку три раза (по одному для каждого потока в пуле), и он печатает "3" через "19":
AttributeError: 'module' object has no attribute 'f'
Первые три вызова apply_async никогда не возвращаются.
Между тем, если я попробую:
from multiprocessing import Pool
p = Pool(3)
def f(x): print(x)
p.map(f, range(20))
Я получаю AttributeError 3 раза, оболочка печатает "6" до "19", а затем зависает и не может быть убита [Ctrl] + [C]
В многопроцессорных документах есть следующее:
Функциональность в этом пакете требует, чтобы модуль mainимпортируемые детьми.
Что это значит?
Чтобы уточнить, я запускаю код в терминале для тестирования функциональности, но в конечном итоге я хочу, чтобы это можно было разместить в модулях веб-сервера. Как вы правильно используете multiprocessing.Pool в терминале python и в модулях кода?