您的位置:首页 > 编程语言 > Python开发

python multiprocessing 创建多进程

2018-03-29 12:25 330 查看
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调用的位置即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python