ProcessPoolExecutor每个进程启动致脚本重启重复打印的原因及解决办法
ProcessPoolExecutor启动子进程重复执行顶层代码的原因与解决方法
原因
使用ProcessPoolExecutor时,Python会创建独立的子进程并行处理任务。子进程启动时会重新导入当前脚本文件,以获取要执行的任务函数(比如示例中的is_prime)。你写在if __name__ == '__main__':代码块之外的print('TEST')属于顶层代码,脚本被导入阶段就会执行,因此每个子进程启动时都会运行这行代码,导致多次打印'TEST'。
解决方法
将仅需主进程执行的顶层代码,全部移至if __name__ == '__main__':代码块内部。因为子进程导入脚本时,__name__变量的值不是__main__(通常为__mp_main__),所以这部分代码不会被执行。
修改后的示例代码:
import concurrent.futures import math PRIMES = [ 112272535095293, 112582705942171, 112272535095293, 115280095190773, 115797848077099, 1099726899285419] def is_prime(n): if n < 2: return False if n == 2: return True if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True def main(): print('TEST') # 仅主进程执行 with concurrent.futures.ProcessPoolExecutor() as executor: for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): print('%d is prime: %s' % (number, prime)) if __name__ == '__main__': main()
修改后运行,只会在主进程启动时打印一次'TEST',子进程不会重复执行该语句。
内容的提问来源于stack exchange,提问作者PyNoob
相关产品推荐
相关产品推荐

