multiprocessing模块提供了一个Process类来描述进程对象。创建进程时只需要在声明Process对象的时候传入一个执行方法和函数的参数即可,这样就可以完成对一个Process实例的创建。然后通过start()方法来实现启动进程,join()方法实现进程同步。
import os,time
from multiprocessing import Process
def run_proc1(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
print("Process1 end...")
def run_proc2(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
print("Process2 end...")
if __name__=='__main__':
print("Main Process Running...%s"%(os.getpid()))
p1=Process(target=run_proc1,args=('proc1',))
p2=Process(target=run_proc2,args=('proc2',))
p1.start()
p2.start()
p1.join()
p2.join()
print('Main Process End...')
在这段程序中,在MainProcess中创建了两个子进程,proc1和proc2。其中proc1调用方法run_proc1,proc2调用方法run_proc2,并分别传入参数proc1和proc2。在实例化Process的时候,target参数表示实例化执行方法,args表示执行方法需要的参数。
如果实例化时没有指定Process的执行方法,将默认调用Process的run方法。
在实例化好Process之后,通过start()方法启动进程,运行进程的执行方法。这个倒好理解。join()方法就有点麻烦了。
join()方法的说明
阻塞当前进程,知道调用join()方法的那个进程执行完,再继续执行当前进程,其目的就是实现进程同步
在该段代码中的理解就是,在MainProcess中创建的子进程p1和p2,在他们都调用start方法启动之后,再依次调用join()方法,那么MainProcess必须等到p1和p2执行完毕之后再继续执行。也就相当于在p1和p2调用join方法之后,MainProcess就暂停运行了,并且必须等到p1和p2都运行完毕之后再继续运行。
举个例子,让p1运行的时候休眠5秒,观察MainProcess的运行情况
import os,time
from multiprocessing import Process
def run_proc1(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
time.sleep(5)
print("Process1 end...")
def run_proc2(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
print("Process2 end...")
if __name__=='__main__':
print("Main Process Running...%s"%(os.getpid()))
p1=Process(target=run_proc1,args=('proc1',))
p2=Process(target=run_proc2,args=('proc2',))
p1.start()
p2.start()
p1.join()
p2.join()
print('Main Process End...')
从运行结果可以看到,子进程调用join方法阻塞了主进程,主进程便开始暂停运行,等待子进程运行完毕,当p1休眠5秒的时候,子进程p2运行完毕退出,但是主进程仍然在等待子进程p1运行结束。直到子进程p1休眠结束退出,主进程才继续运行并退出。
这是在创建多个子进程并依次start之后调用join实现进程同步之后的结果。假设我们需要在创建多个子进程之后,希望这些子进程依次运行,那么只需要在对某一个子进程start之后,就调用join方法阻塞主进程即可。
import os,time
from multiprocessing import Process
def run_proc1(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
time.sleep(5)
print("Process1 end...")
def run_proc2(name):
print("Child Process %s Running...%s"%(name,os.getpid()))
print("Process2 end...")
if __name__=='__main__':
print("Main Process Running...%s"%(os.getpid()))
p1=Process(target=run_proc1,args=('proc1',))
p2=Process(target=run_proc2,args=('proc2',))
p1.start()
p1.join()
p2.start()
p2.join()
print('Main Process End...')
总的来说,使用多进程常规方法就是依次调用start启动进程,然后再依次调用join方法来实现进程同步,使主进程等待子进程结束。如果对子进程运行顺序有其他要求,只需要改变join调用的位置即可。