• 并发 --- 32 管道 事件 信号量 进程池


    一.管道(多个时数据不安全)   Pipe 类  

        (像队列一样,数据只能取走一次)

      conn1,conn2 = Pipe()     建立管道

      .send()   发送

      .recv()   接收

    二.事件(等待)     Event类

      名 = Event()   建立一个事件(默认状态为False)
      名.set() 改变值为True
      名.clear() 改变值为False
      名.is_set() 查看事件的状态
      名.wait() 如果状态是False 阻塞
                  True 不阻塞

    三.信号量    Semaphore类

       (进程锁时只允许串行,而信号量允许多个)

      内部维护了一个计数器,acquire-1,release+1,

      为0的时候,其他的进程都要在acquire之前等待

      名 = Semaphore(数量)

      名.acquire()

      锁的代码

      名.release()

    四.进程池(进程的创建和销毁是很有消耗的,影响代码执行效率)

      名 = Pool(数量)

      1.   名.map(函数,迭代):异步提交任务,并且传参需要可迭代类型的数据,

                  自带close和join功能

    多进程和进程池的效率比较:

      2.res = apply(f1,args=(i,))  #同步执行任务,必须等任务执行结束

          才能给进程池提交下一个任务,可以直接拿到返回结果res

     

      3.res_obj = apply_async(f1,args=(i,))  #异步提交任务,

        可以直接拿到结果对象,从结果对象里面拿结果,要用get方法,

        get方法会阻塞程序,没有拿到结果会一直等待

     

      4.Close : 锁住进程池,防止有其他的新的任务在提交给进程池

          Join : 等待着进程池将自己里面的任务都执行完

    五.回调函数(进程池Pool类)

      Apply_async(f1,args=(i,),callback=function)  

      #将前面f1这个任务的返回结果作为参数传给callback指定的那个function函数

  • 相关阅读:
    [动图演示]Redis 持久化 RDB/AOF 详解与实践
    挑战10个最难的Java面试题(附答案)【上】
    Python使用psutil模块,做你的电脑管家
    在线工具 正则表达式
    [USACO09JAN]Earthquake Damage
    [USACO09MAR]Moon Mooing
    [HNOI2005]汤姆的游戏
    [SDOI2010]大陆争霸
    [USACO08NOV]Cheering up the Cow
    [USACO08NOV]lites
  • 原文地址:https://www.cnblogs.com/amirky/p/10268589.html
Copyright © 2020-2023  润新知