如何在python中使用多处理,对吗? 导入时间 从多处理导入进程 开始=时间。性能计数器() def sleep(): 打印('睡眠1秒…) 时间。睡眠(1) 返回“完成睡眠…” p1=进程(目标=睡眠) p2=进程(目标=睡眠) p1.开始() p2.start() p1.join() p2.join() 完成=时间。性能计数器() 打印(f'在{轮(完成开始,2)}秒内完成)
输出:如何在python中使用多处理,对吗? 导入时间 从多处理导入进程 开始=时间。性能计数器() def sleep(): 打印('睡眠1秒…) 时间。睡眠(1) 返回“完成睡眠…” p1=进程(目标=睡眠) p2=进程(目标=睡眠) p1.开始() p2.start() p1.join() p2.join() 完成=时间。性能计数器() 打印(f'在{轮(完成开始,2)}秒内完成),python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,输出: Finished in 0.17 second(s) Sleeping 1 second(s)... Sleeping 1 second(s)... Finished in 2.35 second(s) 我尝试使用多处理,但当我运行代码时,它在0.17秒内结束,而不是像预期的1秒,它根本不会启动函数 如果我用这样的括号: p1 = Process(target = sleep()) p2 = Process(target = sleep()) 输出: Finished in 0.1
Finished in 0.17 second(s)
Sleeping 1 second(s)...
Sleeping 1 second(s)...
Finished in 2.35 second(s)
我尝试使用多处理,但当我运行代码时,它在0.17秒内结束,而不是像预期的1秒,它根本不会启动函数
如果我用这样的括号:
p1 = Process(target = sleep())
p2 = Process(target = sleep())
输出:
Finished in 0.17 second(s)
Sleeping 1 second(s)...
Sleeping 1 second(s)...
Finished in 2.35 second(s)
视窗10。python 3.7.4
谢谢:)我已经解决了这个问题,为了使您的代码正常工作,您应该添加if
\uuuuuuuu name\uuuuuuuu='\uuuuuu main\uuuuu'
。您的两个新进程都需要访问def sleep(),若要访问def sleep(),您必须将代码的“可执行”部分通过\uuuu name\uuu==“\uuu main\uuu”
分隔开,或者将def sleep()放入另一个文件中,然后从文件名导入sleep将其导出
import time
from multiprocessing import Process
start = time.perf_counter()
def sleep():
print('Sleeping 1 second(s)...')
time.sleep(1)
return 'Done Sleeping...'
if __name__ == "__main__":
p1 = Process(target = sleep)
p2 = Process(target = sleep)
p1.start()
p2.start()
p1.join()
p2.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)')
希望答案对你有用
Doug Hellmann编写的网站表单手册“Python 3标准库示例”:
线程和多处理示例之间的一个区别是额外的保护
对于包含在多处理示例中的\uuuuu main\uuuuu
。由于新流程的方式
启动后,子进程需要能够导入包含目标函数的脚本。
在检查\uuuu main\uuuuu
时包装应用程序的主要部分可确保它确实如此
在导入模块时,不要在每个子级中递归运行。另一种方法是进口
从单独的脚本中删除目标函数。例如,multiprocessing_import_main.py
使用第二个模块中定义的辅助函数
对于3.7,您的代码在meCheck中的运行与预期的一样,在Python3.8下,您的代码也在运行<代码>在1.16秒内完成。代码输出后,请注意第二个版本需要2秒的原因是主线程中正在计算
sleep()
,并且将sleep()
的返回值作为目标传递。这不会改变任何事情。在睡眠状态下尝试打印(\uuuuu name\uuuuuu)。进程不执行文件,只执行函数。@graphite我没有编写该进程执行文件,但它应该有权访问定义的函数。为此,函数应该在单独的文件中,或者用name==main形式其他代码分隔,name==main定义当我们直接运行文件时会发生什么,以上都是“支持”如果运行操作代码,则会出现以下错误:“RuntimeError:在当前进程完成引导阶段之前,尝试启动新进程。这可能意味着您没有使用fork启动子进程,并且忘记了在主模块中使用正确的习惯用法:if name='main':freeze\u support()或“freeze\u support()”如果程序不会被冻结以生成可执行文件,则可以省略第行。“OP代码按预期为我运行,是的,它确实会fork。明白了。这是Windows上的默认值。