Используйте Python Pool с менеджером контекста или закройте и присоединитесь - PullRequest
2 голосов
/ 07 марта 2019

Документация Python содержит примеры в формате

with Pool() as p:
    p.map(do)

, но я вижу множество людей, использующих приведенный ниже формат.

p = Pool()
p.map(do)
p.close()
p.join()

более желательно?

1 Ответ

3 голосов
/ 07 марта 2019

Я думаю, что использование Pool в качестве менеджера контекста (например, with ...) желательно.Это более новое дополнение к Pool, и оно позволяет более четко инкапсулировать срок жизни пула.

Следует помнить, что при выходе из диспетчера контекста он завершает работу пула и любой другойтекущие задачи.Это означает, что вы все еще хотите сделать p.join() в некоторых случаях.В вашем примере это не требуется, поскольку p.map будет блокировать выполнение до тех пор, пока задача не будет выполнена:

Параллельный эквивалент встроенной функции map () (она поддерживает только один итеративный аргумент).хоть).Он блокируется, пока результат не будет готов.

https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.map

Поэтому во втором примере вызовы .join() и .close() являются избыточными, поскольку задача имеетзавершено, и никакие другие задачи не будут выполняться.

Однако использование .map_async сделает .join полезным:

with Pool() as p:
    p.map_async(do_something, range(100))
    # Do something else while tasks are running
    p.join()
...