Python 多重处理错误地重新 运行 整个文件

Python Multiprocessing Erroneously Re-Running Entire File

我正在 python(在 windows 电脑上)试验多处理,并编写了一个测试脚本来比较使用和不使用多处理的简单过程的速度。我期望这样做是计算三个指数两次,一次通过多处理,一次正常,在三个多处理计算中的每一个完成时打印“结果”,并打印两个计算版本中的每一个所花费的时间。预期输出是:

result
result
result
multiprocessing took 0.2
normal processing took 0.4

我实际得到的是:

multiprocessing took 0.0
multiprocessing took 0.0
normal processing took 0.013965368270874023
multiprocessing took 0.0
multiprocessing took 0.0
normal processing took 0.025931358337402344
multiprocessing took 0.0
multiprocessing took 0.0
normal processing took 0.009973287582397461
multiprocessing took 0.0
normal processing took 0.009966135025024414
multiprocessing took 0.0
normal processing took 0.00798344612121582
normal processing took 0.00798344612121582
normal processing took 0.00798177719116211
normal processing took 0.008982181549072266
result
result
result
multiprocessing took 0.5913138389587402
normal processing took 0.005980491638183594

看起来代码是 运行 重复的,而且顺序很奇怪。此外,如果我在 if __name__ == '__main__': 中包含一个 else 语句,它在 __name__ 不是 '__main__' 时打印“oops”,我看到代码也是 运行 迭代,其中 __name__ == '__main__' 不满意,我认为这是不可能的。

这是我使用的代码,谁能指出是什么导致了它的异常?提前致谢。

import concurrent.futures
import time

def function(x,y):
    return x**y

StartTime1 = time.time()

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor() as executor:
        f1 = executor.submit(function, 3,4)
        f2 = executor.submit(function, 5,6)
        f3 = executor.submit(function, 7,8)

        for f in concurrent.futures.as_completed([f1,f2,f3]):
            print("result")

FinishTime1 = time.time()

print(f"multiprocessing took {FinishTime1-StartTime1}")

StartTime2 = time.time()

b1 = function(3,4)
b2 = function(5,6)
b3 = function(7,8)

FinishTime2 = time.time()

print(f"normal processing took {FinishTime2-StartTime2}")

当您导入或加载此文件时,将执行 if 条件之外的所有代码。

构建文件的正确方法是将所有内容放在方法中,然后从 if 条件中调用这些方法

if __name__ == '__main__':

侯赛因的解决方案奏效了。对于未来的提问者,下面调整后的代码具有正确的输出(请注意,所有输出现在都在条件 if __name__ == '__main__': 内缩进)

import concurrent.futures
import time

def function(x,y):
    return x**y

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor() as executor:
        StartTime1 = time.time()
        
        f1 = executor.submit(function, 3,4)
        f2 = executor.submit(function, 5,6)
        f3 = executor.submit(function, 7,8)

        FinishTime1 = time.time()

        for f in concurrent.futures.as_completed([f1,f2,f3]):
            print("result")


    

    print(f"multiprocessing took {FinishTime1-StartTime1}")

    StartTime2 = time.time()

    b1 = function(3,4)
    b2 = function(5,6)
    b3 = function(7,8)

    FinishTime2 = time.time()

    print(f"normal processing took {FinishTime2-StartTime2}")