进程之间的运行次序
import time,os
from multiprocessing import Process
def func(args1,args2):
print(args1,args2)
print(1234)
time.sleep(1)
print(654323)
if __name__ == '__main__':
p = Process(target=func,args=('canshu1','canshu2'))# 注册一个进程
#p是一个进程对象,还没有启动,通过start()来启动
p.start()
print('1234567') #此时这个 print与p进程是同时进行的,不知道他俩谁快谁满。
print('父进程:',os.getpid())#查看当前进程的进程号 getpid意思是get parent id
print('父进程的父进程:',os.getppid())#查看当前进程的父进程 getppid意思是get parent process id
输出:两者通过异步运行方式运行。
进程的生命周期
- 主进程
- 子进程
- 开启了子进程的主进程:
1. 主进程自己的代码如果长,等待爱自己的代码执行结束
2. 子进程的执行时间长,主进程会在主进程代码执行完毕之后,等待子进程执行完毕之后,主进程才结束。
进程中的join方法
import time
from multiprocessing import Process
def func(args1,args2):
print('*'* args1)
time.sleep(3)
print('-' *args2)
if __name__ == '__main__':
p = Process(target = func,args=(4,4))
p.start()
p.join() #感知一个子进程的结束,将异步的程序改为同步
print('=======================================:打印完了')
输出:
自定义类需要继承Process类,必须实现一个run方法,run方法中是在子进程中执行的代码。
import os
from multiprocessing import Process
class Myprocess(Process):
def run(self):
print(os.getpid)
if __name__ == '__main__':
print('主:',os.getpid())
p1 = Myprocess()
p1.start()
p2 = Myprocess()
p2.start()
输出:
传参数
特别注意:一定要实现run方法,因为进程的start方法,依赖于类中的run方法,所以一定要在类中实现run方法。
import os
from multiprocessing import Process
class Myprocess(Process):
def __init__(self,arg1,arg2):
super().__init__() #使用父类的init方法
self.arg1 = arg1
self.arg2 = arg2
def run(self):
print(self.arg1,self.arg2)
print(os.getpid)
if __name__ == '__main__':
print('主:',os.getpid())
p1 = Myprocess(3,2)
p1.start()
p2 = Myprocess(6,7)
p2.start()
多进程之间的数据隔离问题
进程与进程之间数据是完全隔离的。
import os
from multiprocessing import Process
def func():
global n
n = 0
print('pid:%s'%os.getpid(),n)
if __name__ == '__main__':
n = 100
p = Process(target=func)
p.start()
p.join()
print(os.getpid(),n)
输出: