在看多进程知识时碰到一个小问题,自己跑了一下两个博主的代码才弄懂
https://blog.csdn.net/caoxinjian423/article/details/83031916
https://blog.csdn.net/miaoqinian/article/details/80062740
e.g.1
#!/usr/bin/env python
# coding:UTF-8
from multiprocessing import Process
from time import sleep
def run():
print("子进程启动")
sleep(3)
print("子进程结束")
if __name__ == "__main__":
print("父进程启动")
p = Process(target=run)
p.start()
#父进程的结束不影响子进程,join()可以让父进程等待子进程结束再执行父进程
p.join()
sleep(1)
print("父进程结束")
运行结果:
这个理解起来很容易。
e.g.2
from multiprocessing import Process
import time
def test(name):
print("%s is running "% name)
time.sleep(2)
print('%s is done'%name)
if __name__ == '__main__':
#在windows系统之上,开启子进程的操作一定要放在这下面
# Process(target=test,kwargs={'name':'monicx'})
p=Process(target=test,args=('monicx',))
p.start()#向操作系统发送一个请求,操作系统会申请内存空间给,然后把父进程的数据拷贝给子进程,作为子进程的初始数据。
print('=======主')
运行结果:
我就很奇怪第二个例子为什么不是先执行p.start()输出子进程内容,毕竟因为主进程内容在它之后。看了两个例子的区别,发现了两个例子的区别:e.g.1中多了一句p.join(),而e.g.2没有,于是在e.g.2中主进程之前加入p.join()之后,运行结果
process类的方法:
join(timeout):让主线程等待某一子进程结束,才继续执行主进程。timeout是可选的超时时间。超过一个时间主进程就不等待了。
故e.g.1中p.join()方法让子进程“插队”了。