将 Python 池与上下文管理器一起使用或关闭并加入
Use Python Pool with context manager or close and join
Python documentation 中的示例格式为
with Pool() as p:
p.map(do)
但我看到很多人使用下面的格式。
p = Pool()
p.map(do)
p.close()
p.join()
哪个更令人满意?
我认为使用 Pool
作为上下文管理器(例如,with ...
)是可取的。它是 Pool
的新成员,它可以让您更清晰地封装池的生命周期。
需要注意的一件事是,当上下文管理器退出时,它将终止池和任何正在进行的任务。这意味着在某些情况下您仍想执行 p.join()
。您的示例不需要这样做,因为 p.map
将阻止执行,直到任务完成为止:
A parallel equivalent of the map() built-in function (it supports only one iterable argument though). It blocks until the result is ready.
https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.map
因此,在第二个示例中,调用 .join()
是不必要的,因为 .map()
将阻塞直到所有任务完成。
但是,使用 .map_async
会使 .join
有用:
with Pool() as p:
p.map_async(do_something, range(100))
# Do something else while tasks are running
p.close()
p.join()
Edit:正如 Facundo Olano 指出的那样,.close()
必须始终在 .join()
之前调用,如文档中所述:
Wait for the worker processes to exit. One must call close() or terminate() before using join().
https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.join
Python documentation 中的示例格式为
with Pool() as p:
p.map(do)
但我看到很多人使用下面的格式。
p = Pool()
p.map(do)
p.close()
p.join()
哪个更令人满意?
我认为使用 Pool
作为上下文管理器(例如,with ...
)是可取的。它是 Pool
的新成员,它可以让您更清晰地封装池的生命周期。
需要注意的一件事是,当上下文管理器退出时,它将终止池和任何正在进行的任务。这意味着在某些情况下您仍想执行 p.join()
。您的示例不需要这样做,因为 p.map
将阻止执行,直到任务完成为止:
A parallel equivalent of the map() built-in function (it supports only one iterable argument though). It blocks until the result is ready.
https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.map
因此,在第二个示例中,调用 .join()
是不必要的,因为 .map()
将阻塞直到所有任务完成。
但是,使用 .map_async
会使 .join
有用:
with Pool() as p:
p.map_async(do_something, range(100))
# Do something else while tasks are running
p.close()
p.join()
Edit:正如 Facundo Olano 指出的那样,.close()
必须始终在 .join()
之前调用,如文档中所述:
Wait for the worker processes to exit. One must call close() or terminate() before using join().
https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.join