You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:50:25