初识 Process 多进程模块,可以使启动一个主进程的时候会自动建立一个或多个子进程,进程里的第一个进程就是主进程json
程序执行的实例,每个进程都有惟一的pid,每一个子进程的数据都是互相隔离的。方法:app
同步:只能等待一个事情作完了才能作另外一个事情,好比先作完A才能作B。异步
异步:并行作多个事情,好比一边作A的事情,同时也在作B的事情。函数
一、没约束时,不会待进程执行完再执行下面的代码:学习
from multiprocessing import Process def func(arg1,arg2): print('arg1:',arg1) print('arg2:',arg2) if __name__ == '__main__': p=Process(target=func,args=(5,8)) p.start() print('》》》最后一行代码的打印') # 没约束时,不会待进程执行完再执行下面的代码
二、join():感知子进程的结束,将异步变为同步。ui
# 二、join():感知子进程的结束,将异步变为同步 from multiprocessing import Process def func(arg1,arg2): print('arg1:',arg1) print('arg2:',arg2) if __name__ == '__main__': p=Process(target=func,args=(5,8)) p.start() p.join() # 感知子进程的结束,将异步变为同步 print('》》》最后一行代码的打印')
三、多个子进程执行,列表推导式:必须执行完多个子进程后,再执行下面的代码。spa
from multiprocessing import Process import time def func(arg1,arg2): print('arg1:',arg1) time.sleep(0.1) print('arg2:',arg2) if __name__ == '__main__': p_list=[] for i in range(5): # 异步多个子进程执行 p = Process(target=func, args=(1*i, 10)) p_list.append(p) p.start() [p.join() for p in p_list] # 必须执行完多个子进程后,再执行下面的代码。 print('哈哈哈!')
一、自定义类,继承Process。3d
注意:传参数需用继承的方法解决,super().__init__()code
# 四、另外一种多进程,自定义类继承Process from multiprocessing import Process import time class My_func(Process): def __init__(self,num): super().__init__() # 传参数需用继承的方法解决 self.num=num def run(self): '''下面多进程要运行的代码''' print(self.num) time.sleep(0.1) print(self.num*self.num) if __name__ == '__main__': p1=My_func(1) p1.start() p2=My_func(2) p2.start()
一、守护进程随着主进程的代码执行完毕而结束:p.daemon=True blog
from multiprocessing import Process import time def func(): while 1: time.sleep(1) print('func1') if __name__ == '__main__': p=Process(target=func) p.daemon=True # 设置为守护进程 p.start() print(1) print(p.is_alive()) # 查看进度是否存在,返回bool time.sleep(2) # p.terminate() # 结束一个进程 print(p.is_alive()) time.sleep(2) print('守护进程随着全部主进程执行后而结束!!') print(p.is_alive())
二、进程锁,好比抢票会有多个用户一块儿抢。
①没有锁进程的状况下:发现余票只有一张,但每一个进程都能抢到票了,实际也就只有一张改怎么办?
②进程锁:Lock
这样就能够解决相似这样的问题。
from multiprocessing import Process,Lock import time,json def find(): with open(r'test.py')as f: d = json.load(f) print('剩余免费门票:%s'%d['count']) def buy(i,lock): lock.acquire() # 拿钥匙 with open(r'test.py')as f: d = json.load(f) if d['count']<=0:print('门票已被抢完~') else: print('恭喜用户 %s 成功抢到门票了'%i) if d['count']!=0:d['count']-=1 time.sleep(0.2) with open(r'test.py','w')as f: json.dump(d,f) lock.release() # 还钥匙 if __name__ == '__main__': for i in range(1): # 5个进程同时查询 p=Process(target=find) p.start() lock=Lock() for i in range(5): p1=Process(target=buy,args=(i,lock)) p1.start()
欢迎来你们QQ交流群一块儿学习:482713805