python 并发,futures ProcessPoolExecutor为每个进程重新启动脚本

w8biq8rn  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(218)

我目前正在尝试使用ProcessPoolExecutor而不是Threadpools,因为我需要一个替代方案,以便在网络请求没有响应时可以取消。现在,我偶然发现了使用processPoolExecutor的一个奇怪的副作用:对于每个进程,整个脚本都将重新启动。
示例:

import concurrent.futures
import math

print('TEST')

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():
    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
TEST
TEST
TEST
TEST
TEST
TEST
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False

对于每个进程,"测试"都会再次打印。为什么会这样?我能防止这种情况发生吗?我还没有找到任何关于这个主题的东西。

owfi6suc

owfi6suc1#

如果我理解正确的话,每个流程工作者导入当前文件,然后运行指定的函数--这就是为什么每次都打印print('TEST')
如果你想阻止它,将print移到main函数中,该函数受if __name__ = '__main__'构造的"保护"-这意味着它只在作为"主程序"执行时才运行,而在导入文件时不运行。
参见:www.example.comhttps://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor

    • main**模块必须可以被工作者子进程导入。这意味着ProcessPoolExecutor在交互式解释器中不能工作。

相关问题