1. 1.守护进程(了解)
    2.进程安全(*****)
    互斥锁
    抢票案例
    3.IPC进程间通讯
    manager
    queue(*****)
    4.生产者消费者模型
  2.  
  3. 守护进程
    指的也是一个进程,可以守护着另一个进程
    一个进程a 设置为b的守护进程 b结束时 a会立马结束自己 不管任务是否执行完毕
    使用场景: 例如qq进程 有一个下载任务 交给了一个子进程 但是过程中 qq退出了 下载进程也可以随之关闭了
  4.  
  5. *** p.daemon=True p子进程设置为主进程的守护进程 必须放在开启进程之前设置***
  6.  
  7. 进程安全问题
    当多个进程要同时操作同一个资源时,就可能出现问题
    例如:
    只有一台答应机大那会很多打印任务 如果不加以控制 可能造成打印结果错乱
    解决方案1:加 join 把原本并发的任务变成串行执行
    但是如此一来 进程与顺序就不再平等 顺序已经固定死
    最终的解决方案就是加锁
    使用Lock来实例化产生一把锁
    但是要保证每个进程访问的都是同一把锁
    在访问共享资源前 加锁
    访问完毕后一定要解锁
    不能多次执行acquire 一次acquire对应一次release
    acquire 是一个阻塞函数 会一直等到锁被释放(release调用)才会继续执行
  8.  
  9. lock=Lock()
    lock.acquire() 锁定
    lock.release() 解锁
  1. # from multiprocessing import Process,Lock
  2. # import time,random
  3. #
  4. # def task1(lock):
  5. # lock.acquire()
  6. # print('惺惺相惜想')
  7. # time.sleep(random.randint(1,2))
  8. # lock.release()
  9. #
  10. #
  11. # def task2(lock):
  12. # lock.acquire()
  13. # print('xxx')
  14. # time.sleep(random.randint(1, 2))
  15. # lock.release()
  16. #
  17. # def task3(lock):
  18. # lock.acquire()
  19. # print('1234')
  20. # time.sleep(random.randint(1, 2))
  21. # lock.release()
  22. #
  23. #
  24. # if __name__ == '__main__':
  25. # lock=Lock()
  26. # p1=Process(target=task1,args=(lock,))
  27. # p2 = Process(target=task2, args=(lock,))
  28. # p3 = Process(target=task3, args=(lock,))
  29. #
  30. # p1.start()
  31. # p2.start()
  32. # p3.start()

加锁

  1.  
  2. 加锁之后 并发又变成了串行了 不过与join不同的是 没有规定顺序 谁先抢到谁先执行
  3.  
  4. 问题:一旦加锁 效率降低 不加锁数据要错乱
  5.  
  6. 在使用锁的时候 无可避免的会降低效率
    需要找到一个最合适的地方加上锁
    你锁住的代码越少效率越高
  7.  
  8. join是让整个进程中的代码全部串行 而锁可以部分代码串行
    粒度(被锁住的代码量)越小 效率越高
  9.  
  10. 互斥锁:互相排斥其他进程
  11.  
  12. IPC 进程间通讯
    进程与进程之间 内存是物理隔离的 无法直接通讯
  13.  
  14. 1.使用一个交换文件 在硬盘上创建一个文件 不同进程之间共享这个文件
    优点:交换的数据量几乎没有限制
    缺点:速度慢
    2.系统开辟一块共享内存 来供进程间交换数据
    优点:速度快
    缺点:交换的数据量不能太大
    3.管道
    优点:封装了文件的打开 关闭等操作
    缺点:速度慢 单向传输 编程的复杂度较高
    4.socket
    不仅可用于与远程计算机中的进程通讯 还可以用于与本地进程通讯
    基于内存的速度快
  1. # from multiprocessing import Process,Manager,Lock
  2. #
  3. # import time
  4. #
  5. #
  6. #
  7. # def task(dic,lock):
  8. # lock.acquire()
  9. # i = dic["num"] # 3 3 3
  10. # time.sleep(0.3) #2 2 2
  11. # dic["num"] = i - 1
  12. # lock.release()
  13. #
  14. # if __name__ == '__main__':
  15. # # 共享内存管理器
  16. # m = Manager()
  17. # # 在共享内存区域 创建了一个字典
  18. # dic = m.dict({"num":3})
  19. #
  20. # lock = Lock()
  21. # # 将处于共享内存区域的字典传给子进程
  22. # p =Process(target=task,args=(dic,lock))
  23. # p1 = Process(target=task, args=(dic,lock))
  24. # p2 = Process(target=task, args=(dic,lock))
  25. #
  26. #
  27. # p.start()
  28. # p1.start()
  29. # p2.start()
  30. #
  31. # p.join()
  32. # p1.join()
  33. # p2.join()
  34. #
  35. #
  36. #
  37. # print(dic["num"])

IPC

  1. Manager 共享内存管理器
    开启一个共享的内存区域 可以是列表 字典 array数组
    没有处理进程安全问题 需要自己加锁
  1. queue 队列也是一个容器
    特点:先进先出
    支持进程间共享
    自动出来了进程安全问题(加锁)
    例如:迅雷下载 先添加的任务一定先开始执行
  2.  
  3. 堆栈:
    特点:先进后出
    例如:函数的执行 吃薯片 最上面的最先吃
  4.  
  5. put()会阻塞,直到队列里面有位置为止
    get()也会阻塞,直到队里里面有数据为止
    putobj,block=Truetimeout),block为阻塞的意思,默认为阻塞状态,
    timeout等待超时,只有在blockTrue时有效
  1. # from multiprocessing import Process,Manager,Queue
  2. #
  3. # import time
  4. #
  5. #
  6. #
  7. # def task(q):
  8. # num = q.get() # 3
  9. # time.sleep(0.5)
  10. # q.put(num-1)
  11. #
  12. #
  13. # if __name__ == '__main__':
  14. #
  15. # q = Queue()
  16. # q.put(3)
  17. # # 将处于共享内存区域的字典传给子进程
  18. # p =Process(target=task,args=(q,))
  19. # p1 = Process(target=task, args=(q,))
  20. # p2 = Process(target=task, args=(q,))
  21. #
  22. #
  23. # p.start()
  24. # p1.start()
  25. # p2.start()
  26. #
  27. # p.join()
  28. # p1.join()
  29. # p2.join()
  30. #
  31. #
  32. #
  33. # print(q.get())

QUE队列

  1.  
  2. 生产者消费者模型
    模型即解决某个问题的套路
    问题:
    生产者负责产生数据
    消费者处理数据
    当消费者与生产者的能力不匹配时,必须一放要等待另一方 这样效率就变低了
  3.  
  4. 1.将原本由同一个进程完成的 两个(生产和消费) 拆分为两个不交给两个不同的角色(进程)来完成
    2.由于进程间内存相互隔离 所以需要为两个角色之间提供一个共享的数据容器
    3.生产 将生产完成的数据 放入容器中
    4.消费者从 容器中取出数据来处理
  5.  
  6. 生产者消费者模型的优点:
    1.平衡了生产者和消费者之间的能力差异 提高处理效率
    2.降低了双方耦合度
  7.  
  8. 学习并发 的两个核心问题 安全性 效率
  1. from multiprocessing import Process,Queue
  2. import time,random
  3.  
  4. # 生产者
  5. def xiaomi_factory(name,q):
  6. for i in range(1,6):
  7. time.sleep(random.randint(1,3))
  8. phone = "这是%s生产的 小米9_%s" % (name,i)
  9. print("生产者 生产了%s" % phone)
  10. # 方到柜台 即 存储到队列中
  11. q.put(phone)
  12.  
  13. # 消费者
  14. def buy_mi9(q):
  15. for i in range(10):
  16. # 从队列中取出需要被处理的数据(phone)
  17. time.sleep(random.randint(1, 2))
  18. phone = q.get()
  19. print("消费者 消费了%s" % phone)
  20.  
  21. if __name__ == '__main__':
  22. # 共享数据的队列
  23. q = Queue()
  24.  
  25. # 生产者
  26. p1 = Process(target=xiaomi_factory,args=("北京公司",q))
  27. p2 = Process(target=xiaomi_factory,args=("上海公司",q))
  28. p1.start()
  29. p2.start()
  30.  
  31. # 消费者
  32. c1 = Process(target=buy_mi9,args=(q,))
  33. c1.start()

生产者消费者模型

守护进程,进程安全,IPC进程间通讯,生产者消费者模型的更多相关文章

  1. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

  2. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  3. 守护模式,互斥锁,IPC通讯,生产者消费者模型

    '''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...

  4. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  5. java多线程:线程间通信——生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...

  6. Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  7. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  8. (并发编程)进程IPC,生产者消费者模型,守护进程补充

    一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...

  9. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

随机推荐

  1. 解析xml数据存入bean映射到数据库的 需求解决过程

    解析xml数据存入bean映射到数据库的 需求解决过程2017年12月19日 15:18:57 守望dfdfdf 阅读数:419 标签: xmlbean 更多个人分类: 工作 问题编辑版权声明:本文为 ...

  2. Postman工具——下载与安装(转)

    https://blog.csdn.net/water_0815/article/details/53263643 今天给大家分享一款工具,好的工具能够让开发更高效,有时能成倍地提高.接下来会分几篇来 ...

  3. spring-boot学习之属性配置

    通过@value注解,将配置文件中的内容引入

  4. (八)JavaScript之[JSON]与[void]

    14].JSONJSON 格式在语法上与创建 JavaScript 对象代码是相同的. 方法:JSON.parse(); //将JSON字符串转换为JavaScript对象JSON.stringify ...

  5. Andoid Intent学习之在各个活动之间传递数据

    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...

  6. 【MATLAB】画信号频谱的子函数

    输入信号序列和采样率,该子函数可以画出该信号的频谱图. function [f,spec,NFFT]=spec_fft_plot(sample,L,Fs) % 输入数据说明: % sample:信号序 ...

  7. rrdtool

    参考 http://oss.oetiker.ch/rrdtool/doc https://calomel.org/rrdtool.html http://www.cnblogs.com/lightid ...

  8. ansible测试环境

    ip user sudo_user port usage 192.168.48.81 ansible root 29922 nagios & ansible control 192.168.4 ...

  9. System Center Configuration Manager 2016 必要条件准备篇(Part3)

    步骤3.安装SQL Server 2017 注意:在Configuration Manager服务器(CM16)上以本地管理员身份执行以下操作 按照https://go.microsoft.com ...

  10. vos对接时业务确认及信息安全责任承诺书

           业务确认及信息安全责任承诺书 双方达成一致,******网络科技有限公司向            有限公司提供中国移动网内语音线路接入服务,保证资源长期使用,保证线路资源接通率标 准,合 ...