join()的使用
在之前的例子中,父进程创建并启动子进程后,父进程仍然继续执行 ,但有时我们并不想这样,而是:创建并启动子进程后,让父进程等待,等子进程执行结束后,父进程才继续执行,这时,就用到join()函数
进程阻塞:这种让进程等待,就叫阻塞
join定义
join([timeout])
让主进程阻塞,直到子进程执行结束后,主进程才往下执行,
参数:
- timeout:指定超时时间,单位:秒,
如果设置1秒,表示主进程等待1秒后,继续执行;
如果不设置,父进程一直等待子进程运行结束后,父进程才继续运行
改造之前的例子
#coding=utf-8
import time
from multiprocessing import Process
import os
#打印进程id,父进程id
print('文件开始---,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
def fun():
print('子进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
time.sleep(5)
print('子进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
if __name__ == "__main__":
#打印进程id
print('主进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
#创建进程
p=Process(target=fun)
#启动进程
p.start()
#让父进程阻塞
p.join()
# time.sleep(10)
#子进程pid和name
print('子进程pid=%d,name=%s'%(p.pid,p.name))
print('主进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
执行结果:
文件开始---,pid=12244,ppid=11080
主进程开始,pid=12244,ppid=11080
文件开始---,pid=7672,ppid=12244
子进程开始,pid=7672,ppid=12244
子进程结束,pid=7672,ppid=12244
子进程pid=7672,name=Process-1
主进程结束,pid=12244,ppid=11080
子进程运行后,父进程才继续运行
修改代码,p.join(2),表示父进程阻塞2秒后,再继续运行
创建多个子进程时,join()的bug
观察下面 有问题 代码,并观察执行结果:
#coding=utf-8
from multiprocessing import Process,Value
import time
import os
def task():
for index in range(1000):
print('task()开始,i=%d,pid=%d'%(index,os.getpid()))
def task2():
for index in range(1000):
print('task2()开始,i=%d,pid=%d'%(index,os.getpid()))
if __name__ == "__main__":
p=Process(target=task)
p.start()
p.join()
p2=Process(target=task2)
p2.start()
p2.join()
观察代码
15-21行代码
通过观察运行
会发现打印的结果是先执行第一个子进程,执行结束后,才执行第二个子进程,这不符合并发多进程的目的,应该是两个进程在同时执行
修复上面代码bug
#coding=utf-8
from multiprocessing import Process,Value
import time
import os
def task():
for index in range(900):
print('task()开始,i=%d,pid=%d'%(index,os.getpid()))
def task2():
for index in range(900):
print('task2()开始,i=%d,pid=%d'%(index,os.getpid()))
if __name__ == "__main__":
p=Process(target=task)
p2=Process(target=task2)
p.start()
p2.start()
p.join()
p2.join()
15-22行代码的顺序做了调整,再次执行,两个进程都在打印,也就是说在同时执行