我目前正在尝试使用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
对于每个进程,"测试"都会再次打印。为什么会这样?我能防止这种情况发生吗?我还没有找到任何关于这个主题的东西。
1条答案
按热度按时间owfi6suc1#
如果我理解正确的话,每个流程工作者导入当前文件,然后运行指定的函数--这就是为什么每次都打印
print('TEST')
。如果你想阻止它,将
print
移到main
函数中,该函数受if __name__ = '__main__'
构造的"保护"-这意味着它只在作为"主程序"执行时才运行,而在导入文件时不运行。参见:www.example.comhttps://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor