一守护进程
主进程创建守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
from multiprocessing import Proscess
import time
def task(name):
print('%s is running'%name)
time.sleep(3)
if __name__=='__main__':
obj=Process(target=task,args=('lg',))
obj.deamon=True
obj.start()#在发送信号给操作系统启动前要定义守护进程
print('主')
二、互斥锁:
from multiprocessing import Process,Lock
import time,random
互斥锁:
强调:必须是lock.acquire() 一次,然后lock.release()释放一次,才能继续lock.acquire(),不能连续的lock.acpuire()
互斥锁vs join的区别一:
大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序
区别:join是按照人为指定的顺序执行,而互斥锁是所有进程平等地竞争,谁抢到谁执行
抢票系统
from multiprocessing iimport Process,Lock
import json,os,time,random
mutex=Lock()
#互斥锁vs join 的区别一:
#互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串
def check():
time.sleep(random.randint(1,3))
dic=json.load(open('a.json','r',encoding='utf-8'))
print('%s剩余票%s'%(os.getpid(),dic['count']))
def get():
dic=json.load(open('a.json','r',encoding='utf-8'))
if dic['count']>0:
dic['count']-=1
json.dump('a.json','w',encoding='utf-8')
print('%s购票成功'%os.getpid())
def task(lock):
check()
lock.acquire()
get()
lock.release
if __name__=='__main__':
for i in range(10):
p=Process(target=task,args=(mutex,))
p.start
四IPC通信机制
进程之间通信必须找到一种介质,该介质必须满足
1、是所有进程共享的
2、必须是内存空间
附加处理:自动处理好锁的问题
from multiprocessing import Queue
对列:
1、共享的空间
2、是内存空间
3、自动帮我们处理好锁定问题
q=Queue(3)
q.put('first')
q.put({'second':None})
q.put('三')
q.put(4)#阻塞
print(q.get())
print(q.get())
print(q.get())
强调:
1、队列用来存成进程之间沟通的消息,数据量不应该过大
2、maxxize的值超过的内存限制就变得毫意义
五、生产者消费者模型
该模型中包含两类重要的角色:
1、生产者:将负责造数据的任务比喻为生产者
2、消费者:接收生产者造出的数据来做进一步的处理,该类人物被比喻成消费者
实现生产者消费者模型三要素
1、生产者
2、消费者
3、队列
什么时候用该模型:
程序中出现明显的两类任务,一类任务是负责生产,另一类任务是负责处理生产的数据的
该模型的好处:
1、实现了生产者与消费者解耦和
2、平衡了生产力与消费力,即生产者可以一直不停地生产,消费者可以不停地处理,因为二者不再
直接沟通的,而是跟队列沟通的。
import time,randon
from multeprocessing import Process,Queue
def consumer(name,q)
while True:
res=q.get()
time,sleep(random.randint(1,3))
print('%s吃了%s'%(name,res))
def producer(name,q,food):
for i in range(5):
time.sleep(random.randint(1,2))
res='%s%s'%(food,i)
q.put(res)
prnt(‘%s生产了%s’%(name,res))
if __name__=='__main__'
q=Queue()
p1=Process(target=produce,args=('egon',q,'aa'))
p2=Process(target=produce,args=('lg',q,'米饭'))
c1=Process(target=consumer,args=('alex',q))
c2=Process(target=consumer,args=('aa',q))
p_lis=[p1,p2,p3,c1,c2]
for i in p:
i.start()