day29并发编码之多进程

时间:2020-12-23 16:39:14

一守护进程

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常: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()