zoukankan      html  css  js  c++  java
  • day 31 重点同步锁以及进程通信IPC队列

    一 . 同步锁(互斥锁)

      对我很重要的东西,也是工作中经常能用到的东西,保证数据安全用的,但是将锁起来的那段代码的执行变成了同步/串行,牺牲了效率,保证了安全。

        from multiprocessing import Process,Lock

        L = Lock()

        L.acquire() 加锁 ,保证每次只有一个程序在执行锁里里面的程序,这一段程序对于所有写上这个锁的过程,大家都变成了串行

        数据操作

        L.release() 解锁,解锁之后其他进程才能去执行自己的程序

    二 . 信号量

        Semaphore 内部维护了一个计数器,acquire - 1,release + 1, 当计数器为0的时候,阻塞其他进程

    三. 事件

       e = Event , 事件初识状态为False,当事件为Flase , e.wait () 的地方就会阻塞,e. set( )将e 的状态改为 True ,如果e 的状态为 True,wait 的地方就不等待了,不阻塞了,e.clear( )将e 的状态改为False ,查看e 的状态:is _set .

    四 . 进程通信(IPC)

      队列:进程安全的,能够保证数据安全,像一个特殊的列表,从前面插入数据,从后面读取数据,先进先出。

      Q = queue(4),括号里给队列设定一个固定的长度,q.put()  往队列中添加数据  ,q.get()    取出数据,   q.get_nowait(),q.gei(False),

      Q.put()  在队列满了的时候会阻塞和q.get 在队列空了之后会阻塞

      Q.put_nowait()  

      q.qsize()发挥队列中目前项目的正确数量

      q.empty()如果调用此方法时,q为空,返回True。

      q.full()如果q已满,返回为True,由于线程的存在,结果也可能是不可靠的

    五 . 生产者消费者模型

      在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程,在多线程开发当中,如果生产者处理速度很快,而消费处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。反过来,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。

      生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者之间不直接通讯,二十通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找消费者直接要数据,二十直接从阻塞队列里去取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

    六 . JoinableQueue

      引入模块:from multiprocessing import Process,JoinableQueue

      能记录你往队列里面put的数据量,其他方法和queue是一样的,比queue多了两个方法:

      q.task_done ()使用者者使用此方法发出信号,表示q.get()的返回项目已经被处理。

      q.join() 生产者调用此方法确保主进程结束才能进行阻塞,直到队列中所有的项目均被处理。

      daemon = True  :守护进程 如果不加守护,那么主进程结束不了,但是加了守护之后,必须确保生产者的内容生产完或者被处理完,所有必须还要再主进程给生产者设置join,才能确保生产者生产的任务被执行完了,并且能够确保守护进程在所有任务执行完了之后才随着主进程的结束而结束。

      q.task_done () 方法为止,也就是队列中的数据全部被get拿走了。

  • 相关阅读:
    项目集管理
    项目集管理:战略项目与多项目管理之道
    项目组合管理、项目集管理、项目管理和组织级项目管理之间的关系
    极限编程简述
    项目群管理
    数据结构基础温故-4.树与二叉树(下)
    数据结构基础温故-4.树与二叉树(中)
    数据结构基础温故-4.树与二叉树(上)
    使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
    数据结构基础温故-3.队列
  • 原文地址:https://www.cnblogs.com/liuteacher/p/10032773.html
Copyright © 2011-2022 走看看