1.  
  1. # 管道
    # 数据共享 Manager
    # 进程池和回调函数 !
  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/18 14:23
  4. # !@Author TrueNewBee
  5. # 管道 实现两进程间的信息传递
  6. from multiprocessing import Pipe, Process
  7.  
  8. # 一种使用管道方式
  9. def func(conn3, conn4):
  10. conn4.close() # 把多余通道关闭
  11. while True:
  12. try:
  13. msg = conn3.recv() # 接收消息
  14. print(msg)
  15. except EOFError: # 没有数据可以取的时候抛出异常
  16. conn3.close()
  17. break
  18.  
  19. if __name__ == '__main__':
  20. conn1, conn2 = Pipe() # 接收两个参数 两个管道
  21. Process(target=func, args=(conn1, conn2)).start()
  22. conn1.close() # 关闭多余通道
  23. for i in range(20):
  24. conn2.send('吃了吗') # 发送消息
  25. conn2.close()
  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/18 15:01
  4. # !@Author TrueNewBee
  5.  
  6. # pipe 数据不安全性 这是一个例子,下面有另外一个解决方案的代码加上锁!
  7. # IPC
  8. import time
  9. import random
  10. from multiprocessing import Process, Pipe
  11.  
  12. def producer(con1, pro1, name, food):
  13. """通过管道把生产东西传给消费者"""
  14. con1.close()
  15. for i in range(4):
  16. time.sleep(random.randint(1, 3))
  17. f = '%s生产%s%s' % (name, food, i)
  18. print(f)
  19. pro1.send(f)
  20. pro1.close()
  21.  
  22. def consumer(con2, pro2, name1):
  23. pro2.close()
  24. while True:
  25. try:
  26. food = con2.recv()
  27. print('%s吃了%s' % (name1, food))
  28. time.sleep(random.randint(1, 3))
  29. except EOFError:
  30. con2.close()
  31. break
  32.  
  33. if __name__ == '__main__':
  34. con, pro = Pipe()
  35. p = Process(target=producer, args=(con, pro, 'a', '泔水'))
  36. c1 = Process(target=consumer, args=(con, pro, 'b'))
  37. c2 = Process(target=consumer, args=(con, pro, 'c'))
  38. c3 = Process(target=consumer, args=(con, pro, 'd'))
  39. p.start()
  40. c1.start()
  41. c2.start()
  42. c3.start()
  43. con.close()
  44. pro.close()
  45.  
  46. # 加上锁解决pipe数据不安全问题
  47. # from multiprocessing import Process, Pipe, Lock
  48. #
  49. #
  50. # def consumer(p, name, lock1):
  51. # produce1, consume1 = p
  52. # produce1.close()
  53. # while True:
  54. # lock1.acquire()
  55. # food=consume1.recv()
  56. # lock.release()
  57. # if food:
  58. # print('%s 收到包子:%s' %(name,baozi))
  59. # else:
  60. # consume1.close()
  61. # break
  62. #
  63. #
  64. # def producer(p, n):
  65. # produce2, consume2=p
  66. # consume2.close()
  67. # for i in range(n):
  68. # produce2.send(i)
  69. # produce2.send(None)
  70. # produce2.send(None)
  71. # produce2.close()
  72. #
  73. #
  74. # if __name__ == '__main__':
  75. # produce,consume=Pipe()
  76. # lock = Lock()
  77. # c1 = Process(target=consumer, args=((produce, consume), 'c1', lock))
  78. # c2 = Process(target=consumer, args=((produce, consume), 'c2', lock))
  79. # p1 = Process(target=producer, args=((produce, consume), 10))
  80. # c1.start()
  81. # c2.start()
  82. # p1.start()
  83. #
  84. # produce.close()
  85. # consume.close()
  86. #
  87. # c1.join()
  88. # c2.join()
  89. # p1.join()
  90. # print('主进程')
  91.  
  92. # 加锁来控制操作管道的行为 来避免进程之间争抢数据造成的数据不安全现象
  93.  
  94. # 队列 进程之间数据安全的
  95. # 管道 + 锁
  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/18 15:51
  4. # !@Author TrueNewBee
  5.  
  6. # 牺牲效率 保障了数据安全
  7. from multiprocessing import Manager, Process, Lock
  8.  
  9. def main(dic1, lock1):
  10. lock1.acquire() # 加上所也是为了数据不安全问题
  11. dic1['count'] -= 1
  12. lock1.release()
  13.  
  14. if __name__ == '__main__':
  15. m = Manager()
  16. lock = Lock()
  17. dic = m.dict({'count': 100})
  18. p_list = []
  19. for i in range(50):
  20. p = Process(target=main, args=(dic, lock))
  21. p.start()
  22. p_list.append(p)
  23. for i in p_list:
  24. p.join()
  25. print('主进程:', dic)

管道介绍:

真正在用的时候,底层东西不用,都是拿来主义,面试造核弹,工作拧螺丝!!!

7.18 python进程间数据共享的更多相关文章

  1. 进程间数据共享 (multiprocess.Manager)

    进程间数据共享 (multiprocess.Manager) 一.进程之间的数据共享 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队 ...

  2. python进程间共享数值、字典、列表变量

    ##python进程间共享数值.字典.列表变量 关注公众号"轻松学编程"了解更多. import multiprocessing def worker(num, mgr_dict, ...

  3. Perl进程间数据共享

    本文介绍的Perl进程间数据共享内容主体来自于<Pro Perl>的第21章. IPC简介 通过fork创建多个子进程时,进程间的数据共享是个大问题,要么建立一个进程间通信的通道,要么找到 ...

  4. Python程序中的进程操作-进程间数据共享(multiprocess.Manager)

    目录 一.进程之间的数据共享 1.1 Manager模块介绍 1.2 Manager例子 一.进程之间的数据共享 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大 ...

  5. Python之路(第三十九篇)管道、进程间数据共享Manager

    一.管道 概念 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 先画一幅图帮助大家理解下管道的基本原理 现有2个 ...

  6. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  7. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager

    1.使用multiprocessing模块的Queue实现数据传递 ''' 进程间通讯: Queue,用法跟线程里的Queue一样,put,get 线程queue没有做序列化,进程queue做序列化了 ...

  8. Python 进程间数据交互

    进程间通信:进程之间必须需要中间件. 不同进程间内存是不共享的,要想实现两个进程间的数据交换     Queues:实现传输两个进程的数据 线程queue,访问数据只能在一个进程内进行线程与线程之间的 ...

  9. Python 进程间的通信

    #-*-coding:utf-8-*- '''python提供了多种进程间的通信方式,如:Queue,Pipe,Valie+Array等. Queue与Pipe的区别在于Pipe常用来在两个进程间通信 ...

随机推荐

  1. abbyy在使用时提示更改分辨率如何处理

    ABBYY FineReader 12识别质量取决于文档图像的分辨率.低图像分辨率(低于 150 dp)可能会降低识别质量,而过高的分辨率(高于 600 dpi)也不会明显提升图像质量,还会延长处理时 ...

  2. MapWinGIS------引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常

    转载:http://www.cnblogs.com/dzone/archive/2011/09/08/2171445.html

  3. eclipse中设置文件的编码格式为utf-8

    1.可以在 eclipse 中配置 workspace 项下 text file encoding 属性的值来决定此工作区间下所有的 eclipse 项目的文档的编码属性. Window-->P ...

  4. MongoDB管理

    前几篇文章都是从开发和使用的角度了解了MongoDB的各个知识点,这篇文章将从MongoDB管理的角度入手,了解MongoDB管理所要了解的基本知识. 数据库命令 在前面几篇文章中,已经接触了一些数据 ...

  5. Python easyGUI 猜数字

    import easygui as g import random d=random.randint(0,10) while 1: g.msgbox("现在开始猜数字小游戏:") ...

  6. D盾 v2.0.6.42 测试记录

    0x01 前言 之前发了一篇博客<Bypass D盾_IIS防火墙SQL注入防御(多姿势)>,D哥第一时间联系我,对问题进行修复.这段时间与D哥聊了挺多关于D盾这款产品的话题,实在是很佩服 ...

  7. windows恶意软件删除工具(MRT.exe)检查计算机是否感染病毒使用图解

    Microsoft Windows恶意软件删除工具可以检查运行 Windows XP.Windows 2000 和 Windows Server 2003 的计算机是否受到特殊.流行的恶意软件(包括 ...

  8. SaltStack Grains 和 Pillar

    Grains: (1) grains 是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息(2) grains 是 minion 启动时收集到的一些系统信息,比如操作系统版本.内核版本.C ...

  9. Splash images_enabled 属性

    images_enabled属性用于设置加载页面时是否加载图片,如下,禁止之后,返回的页面截图就不会带有任何图片,加载速度也会快很多 function main(splash, args) splas ...

  10. 流媒体服务器+EasyDarwin+EasyPusher+VLC+Red5+OBS+Unity+RTSP+RTMP+FFMPEG

    最近有个需求在Unity中直播桌面,着用到了视频流. ------------------------------ VLC自身有流服务器功能,但是非常慢非常慢,还是用VLC拉流吧,好像大家也是这么做的 ...