python-Process之join()的使用

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行代码的顺序做了调整,再次执行,两个进程都在打印,也就是说在同时执行


原文出处:/show_1EF2nfTfanIL.html