Простой способ реализации многопроцессорности в python:
from multiprocessing import Pool
def calculate(number):
return number
if __name__ == '__main__':
pool = Pool()
result = pool.map(calculate, range(4))
Альтернативная реализация, основанная на фьючерсах,
from concurrent.futures import ProcessPoolExecutor
def calculate(number):
return number
with ProcessPoolExecutor() as executor:
result = executor.map(calculate, range(4))
Оба варианта делают по существу одно и то же, но одно поразительное отличие состоит в том, что нам не нужно защищать код с помощью обычного предложения if __name__ == '__main__'
. Это потому, что реализация фьючерсов заботится об этом или у нас есть другая причина?
В более широком смысле, в чем разница между multiprocessing
и concurrent.futures
? Когда одно предпочтительнее другого?
РЕДАКТИРОВАТЬ: Мое первоначальное предположение, что охранник if __name__ == '__main__'
необходим только для многопроцессорной обработки, было неверным. По-видимому, этот сторож нужен для обеих реализаций в Windows, в то время как в unix-системах он не нужен.
if
. Согласно документацииProcessPoolExecutor
построен на основеmultiprocessing
, и поэтому он должен страдать от той же проблемы (иначе документацияmultiprocessing
показала бы, как избежать этого охранника, верно?). На самом деле пример из документации использует обычную защиту. - person Bakuriu   schedule 22.07.2014