在Python中实现多进程的简单方法是
from multiprocessing import Pool
def calculate(number):
return number
if __name__ == '__main__':
pool = Pool()
result = pool.map(calculate, range(4))
一个基于futures的替代实现是
from concurrent.futures import ProcessPoolExecutor
def calculate(number):
return number
with ProcessPoolExecutor() as executor:
result = executor.map(calculate, range(4))
两种替代方案基本上都是做相同的事情,但一个显著的区别是我们不必使用通常的if __name__ == '__main__'
子句来保护代码。这是因为futures的实现照顾到了这一点,还是有其他原因?
更广泛地讲,multiprocessing
和concurrent.futures
之间有什么区别?什么时候会更喜欢其中之一?
编辑:我的最初假设是只有在多进程处理中才需要保护if __name__ == '__main__'
。这是错误的。显然,在Windows系统上,两种实现都需要这个保护措施,而在Unix系统上则不需要。
if
保护语句。根据文档,ProcessPoolExecutor
是建立在multiprocessing
之上的,因此它应该遇到同样的问题(否则multiprocessing
文档将展示如何避免该保护语句,对吧?)。实际上,来自文档的示例确实使用了通常的保护语句。 - Bakuriu