我试图理解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循环一样。有人能帮助解决什么问题以及如何纠正它吗
我尝试使用命令行和IDE(特别是
Spyder
)执行您的脚本,我可以观察到以下行为差异当我使用包含您的代码的
python3 mp.py
命令行执行脚本时,我可以看到预期的输出:当我使用
Spyder
IDE中的Run
按钮执行相同的脚本时,我只看到以下输出:我试图寻找行为上的差异,发现了几个描述这种行为的线索
no-multiprocessing-print-outputs-spyder
还有一个关于Windows的特定注释:
此外,一些IDE需要额外的配置,如^{} 所述
基于以上观察,我建议尝试通过命令行运行脚本,以验证脚本本身是否按预期工作,并尝试查看IDE中是否需要任何其他配置来使其工作
所以我做了一些改动,运行得很好。更改是我没有worker4.py文件,将等待时间更改为1秒。最重要的更改是将
print(f "Sleeping {seconds}second(s)...")
行更改为print(f"Sleeping {seconds}second(s)...")
,因为f和第一个引号之间的空格导致了语法错误获得以下输出
相关问题 更多 >
编程相关推荐