未显示所需结果的多处理代码

2024-06-25 06:05:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Python中的多处理,并尝试复制以下代码的结果(摘自Corey Schafer youtube视频)。代码正在运行,但多处理模块不工作。我使用的是Windows10和python版本3.8.5,我的笔记本电脑有8个内核

import time
import multiprocessing
import workers4
tic=time.time()

processes=[]
if __name__ == '__main__':
    for _ in range(50):
        p=multiprocessing.Process(target=workers4.do_something,args=[20])
        p.start()
        processes.append(p)
    
    for process in processes:
        process.join()

toc=time.time()
elapsed=toc-tic
print("\nFinished in ",elapsed," seconds")

文件workers4.py具有函数“do_something”,该函数使代码在通过参数传递的特定时间值内休眠

def do_something(seconds):
    print(f "Sleeping {seconds}second(s)...")
    time.sleep(seconds)
    print("Done sleeping...")

在运行上述代码时,它仅显示
0.8727371692657471秒内完成

并且workers.py文件中的do_something函数中的以下语句一次也没有打印

print(f "Sleeping {seconds}second(s)..."), 
print("Done sleeping...") 

似乎dou_something函数没有像每个进程睡眠时间为20秒那样执行,代码如何在0.8727秒内执行。上述代码中还有50个进程,与for循环一样。有人能帮助解决什么问题以及如何纠正它吗


Tags: 函数代码inimportfortimeticmultiprocessing
2条回答

我尝试使用命令行和IDE(特别是Spyder)执行您的脚本,我可以观察到以下行为差异

当我使用包含您的代码的python3 mp.py命令行执行脚本时,我可以看到预期的输出:

Finished in  0.0  seconds
Sleeping 2 second(s)...

Finished in  0.0  seconds
Sleeping 2 second(s)...

Finished in  0.0  seconds
Sleeping 2 second(s)...

Finished in  0.0  seconds
Sleeping 2 second(s)...

Finished in  0.0  seconds
Sleeping 2 second(s)...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...

Finished in  3.7699832916259766  seconds

当我使用SpyderIDE中的Run按钮执行相同的脚本时,我只看到以下输出:

Finished in  2.8714535236358643  seconds

我试图寻找行为上的差异,发现了几个描述这种行为的线索

no-multiprocessing-print-outputs-spyder

还有一个关于Windows的特定注释:

That printing with multiprocessing on Windows doesn't work as expected

此外,一些IDE需要额外的配置,如^{}所述

基于以上观察,我建议尝试通过命令行运行脚本,以验证脚本本身是否按预期工作,并尝试查看IDE中是否需要任何其他配置来使其工作

所以我做了一些改动,运行得很好。更改是我没有worker4.py文件,将等待时间更改为1秒。最重要的更改是将print(f "Sleeping {seconds}second(s)...")行更改为print(f"Sleeping {seconds}second(s)..."),因为f和第一个引号之间的空格导致了语法错误

import time
import multiprocessing
tic=time.time()

processes=[]

def do_something(seconds):
    print(f"Sleeping {seconds}second(s)...")
    time.sleep(seconds)
    print("Done sleeping...")

if __name__ == '__main__':
    for _ in range(50):
        p=multiprocessing.Process(target=do_something,args=[1])
        p.start()
        processes.append(p)
    
    for process in processes:
        process.join()

toc=time.time()
elapsed=toc-tic
print("\nFinished in ",elapsed," seconds")

获得以下输出

Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Sleeping 1second(s)...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...

Finished in  1.7538056373596191  seconds

相关问题 更多 >