from multiprocessing import Process import os def func1(): print('子进程1',os.getpid()) #子进程:获取当前进程的进程号 print('子进程的父进程:', os.getppid()) #获取进程的父进程id def func2(): print('子进程2',os.getpid()) print('子进程的父进程:', os.getppid()) def func3(): print('子进程3',os.getpid()) print('子进程的父进程:', os.getppid()) if __name__ == '__main__': p1 = Process(target=func1) #注册:将函数名(内存地址)注册进子进程 p2 = Process(target=func2) #p1是一个进程对象 p3 = Process(target=func3) p1.start() #开启了一个子进程 p2.start() #三个并行的子进程 p3.start() print('父进程:',os.getpid()) #父进程:获取当前进程的进程号 print('父进程的父进程:', os.getppid()) #获取进程的父进程id
子进程的执行顺序会变化,说明三个子进程是并行的。
传递参数:
from multiprocessing import Process import os def func1(args): #args接收参数 print('子进程1',os.getpid()) #子进程:获取当前进程的进程号 print('子进程的父进程:', os.getppid()) #获取进程的父进程id print(args) #打印传递进来的参数 if __name__ == '__main__': p1 = Process(target=func1,args=('参数',)) #以元组的形式传递参数,如果只传递一个参数必须要加一个逗号 p1.start() print('父进程:',os.getpid()) #父进程:获取当前进程的进程号 print('父进程的父进程:', os.getppid()) #获取进程的父进程id
结果:
开启多个子进程方法:
from multiprocessing import Process def func1(args): print('*'*args) if __name__ == '__main__': # 可以使用for循环实现开启多个子进程 for i in range(1,5): p1 = Process(target=func1,args=(i,)) p1.start()
结果1: 结果2:
多进程join()方法:
from multiprocessing import Process def func1(args): print('子进程1') print(args) if __name__ == '__main__': p1 = Process(target=func1,args=('参数',)) p1.start() print('hahahahha') # 感知一个子进程的结束,将异步变为同步:join之前为异步 p1.join() # join之后为同步 print('qqqqqqqqq')
结果:
实践:我们想实现先异步输出10句话,最后同步输出执行完毕的结果。
from multiprocessing import Process def func1(args): print('*'*args) if __name__ == '__main__': for i in range(10): p1 = Process(target=func1,args=(i,)) p1.start() p1.join() print('执行完毕!')
但是我们发现,“执行完毕”四个字总是跟随在最长的一句话后面打印输出,然而因为上面10句话是异步的,最长的那句话并不是每次都最后输出,所以我们这样不能现实我们的需求。
from multiprocessing import Process def func1(args): print('*'*args) if __name__ == '__main__': p_list = [] #创建一个空列表用来存放等会生产的进程对象 for i in range(10): p1 = Process(target=func1,args=(i,)) p_list.append(p1)#将每个进程对象依次存放进列表中 p1.start() [i.join() for i in p_list] # 运用列表推导式:循环列表,依次对列表中的进程对象执行join()方法。之前所有进程必须在这里执行完才能执行下面的代码。 print('执行完毕!')
结果1: 结果2: