# 管道
# 数据共享 Manager
# 进程池和回调函数 !
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/18 14:23
# !@Author TrueNewBee
# 管道 实现两进程间的信息传递
from multiprocessing import Pipe, Process # 一种使用管道方式
def func(conn3, conn4):
conn4.close() # 把多余通道关闭
while True:
try:
msg = conn3.recv() # 接收消息
print(msg)
except EOFError: # 没有数据可以取的时候抛出异常
conn3.close()
break if __name__ == '__main__':
conn1, conn2 = Pipe() # 接收两个参数 两个管道
Process(target=func, args=(conn1, conn2)).start()
conn1.close() # 关闭多余通道
for i in range(20):
conn2.send('吃了吗') # 发送消息
conn2.close()
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/18 15:01
# !@Author TrueNewBee # pipe 数据不安全性 这是一个例子,下面有另外一个解决方案的代码加上锁!
# IPC
import time
import random
from multiprocessing import Process, Pipe def producer(con1, pro1, name, food):
"""通过管道把生产东西传给消费者"""
con1.close()
for i in range(4):
time.sleep(random.randint(1, 3))
f = '%s生产%s%s' % (name, food, i)
print(f)
pro1.send(f)
pro1.close() def consumer(con2, pro2, name1):
pro2.close()
while True:
try:
food = con2.recv()
print('%s吃了%s' % (name1, food))
time.sleep(random.randint(1, 3))
except EOFError:
con2.close()
break if __name__ == '__main__':
con, pro = Pipe()
p = Process(target=producer, args=(con, pro, 'a', '泔水'))
c1 = Process(target=consumer, args=(con, pro, 'b'))
c2 = Process(target=consumer, args=(con, pro, 'c'))
c3 = Process(target=consumer, args=(con, pro, 'd'))
p.start()
c1.start()
c2.start()
c3.start()
con.close()
pro.close() # 加上锁解决pipe数据不安全问题
# from multiprocessing import Process, Pipe, Lock
#
#
# def consumer(p, name, lock1):
# produce1, consume1 = p
# produce1.close()
# while True:
# lock1.acquire()
# food=consume1.recv()
# lock.release()
# if food:
# print('%s 收到包子:%s' %(name,baozi))
# else:
# consume1.close()
# break
#
#
# def producer(p, n):
# produce2, consume2=p
# consume2.close()
# for i in range(n):
# produce2.send(i)
# produce2.send(None)
# produce2.send(None)
# produce2.close()
#
#
# if __name__ == '__main__':
# produce,consume=Pipe()
# lock = Lock()
# c1 = Process(target=consumer, args=((produce, consume), 'c1', lock))
# c2 = Process(target=consumer, args=((produce, consume), 'c2', lock))
# p1 = Process(target=producer, args=((produce, consume), 10))
# c1.start()
# c2.start()
# p1.start()
#
# produce.close()
# consume.close()
#
# c1.join()
# c2.join()
# p1.join()
# print('主进程') # 加锁来控制操作管道的行为 来避免进程之间争抢数据造成的数据不安全现象 # 队列 进程之间数据安全的
# 管道 + 锁
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/18 15:51
# !@Author TrueNewBee # 牺牲效率 保障了数据安全
from multiprocessing import Manager, Process, Lock def main(dic1, lock1):
lock1.acquire() # 加上所也是为了数据不安全问题
dic1['count'] -= 1
lock1.release() if __name__ == '__main__':
m = Manager()
lock = Lock()
dic = m.dict({'count': 100})
p_list = []
for i in range(50):
p = Process(target=main, args=(dic, lock))
p.start()
p_list.append(p)
for i in p_list:
p.join()
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. Java查找替换文本文件内容

    文本替换几乎是所有文本编辑器都支持的功能,但是要限制在编辑其中才可以执行该功能.本实例实现了制定文本文件的内容替换,并且不需要再编辑其中打开文本文件. 思路: 先看视图层,要有一个JButton控件用 ...

  2. Java -- 获取指定接口的所有实现类或获取指定类的所有继承类

    Class : ClassUtil package pri.lime.main; import java.io.File; import java.io.IOException; import jav ...

  3. MyBatis入门程序之表关联

    一.一对一查询(ResultType比较简单,只需要指向扩展的类:ResultMap逐个匹配比较麻烦,可以配置属性autoMapping="true",还可以可以实现延迟加载) 1 ...

  4. ubuntu 上安装vnc server

    Ubuntu下设置VNCServer   Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作 ...

  5. unity3d抛物线的脚本

    using UnityEngine; using System.Collections; public class ProjectileTest : MonoBehaviour { public Ga ...

  6. [Vim] Vim 常用基本操作

    1. 导航 1.1. 查看行号 :set number  显示行号 :set number!  隐藏行号 :.=  在底部显示当前行号 :=  在底部显示总行号 1.2. 移动光标 0 或 ^    ...

  7. AngularJS控制器和AngularJS过滤器的学习(3)

    前面简单的学习了AngularJS的表达式和指令,就可以说大概对AngularJS有了一定的了解吧,嘿嘿,下面就来总结学习一下AngularJS的控制器和过滤器哦. 说起来AngularJS控制器,其 ...

  8. 常见C语言编译错误解析【转】

    C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token    解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...

  9. (iOS)使用auto layout进行复杂布局时,UILabel的相关trick

    本文转载至 http://blog.csdn.net/madongchunqiu/article/details/47960745  本文首发于CSDN:http://blog.csdn.net/ma ...

  10. mysql学习笔记(三)

    -- 主键冲突(duplicate key) ,'xujian','anhui'); ,'xiewei','anhui'); ,'luyang','anhui');-- 主键冲突了 -- 可以选择性的 ...