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...')

windows python设置多进程启动方式 python创建多进程_实例化

在这段程序中,在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...')

windows python设置多进程启动方式 python创建多进程_子进程_02

从运行结果可以看到,子进程调用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调用的位置即可。