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()

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/lg04551/p/8944657.html
Copyright © 2011-2022 走看看