【问题标题】:Python Multiprocessing Erroneously Re-Running Entire FilePython 多处理错误地重新运行整个文件
【发布时间】:2020-11-19 22:31:03
【问题描述】:

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

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}")

【问题讨论】:

  • 你是如何执行/启动程序的?我在 Linux 上尝试了你的代码,它产生了预期的输出。
  • 我在 Windows 上使用 Visual Studio 代码运行它
  • 听起来像 Visual Studio 代码执行您的程序的多个实例。你检查你的启动设置了吗?
  • 我没有,但侯赛因在下面的回答已经解决了这个问题。感谢您的帮助!

标签: python python-3.x time multiprocessing python-multiprocessing


【解决方案1】:

当你导入或加载这个文件时,所有if条件外的代码都会被执行。

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

if __name__ == '__main__':

【讨论】:

    【解决方案2】:

    侯赛因的解决方案奏效了。对于未来的提问者,以下调整后的代码具有正确的输出(请注意,所有输出现在都在条件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}")
    
    
    

    【讨论】:

      猜你喜欢
      • 2020-09-19
      • 2021-01-22
      • 2015-09-02
      • 2012-12-18
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多