zoukankan      html  css  js  c++  java
  • day29并发编码之多进程

    一守护进程

    主进程创建守护进程

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

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

  • 相关阅读:
    js变量如何赋值给css使用?
    前端预览与下载PDF小结
    子组件如何改父组件传过来的值
    TensorRT转换时的静态模式与动态模式
    Linux:搭建GlusterFS文件系统
    OpenFeign传输文件MultipartFile
    Docker:commit、export、import、save、load命令的使用
    Git:代码版本回退
    docker安装Drools Workbench
    ArchLinux:Typora设置gitee图床
  • 原文地址:https://www.cnblogs.com/lg04551/p/8944657.html
Copyright © 2011-2022 走看看