一:进程间数据交换方法

  不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:

  Queue,Pipe ,managers

  1)Queue,使用方法跟threading里的queue差不多

  

# -*- coding:utf-8 -*-
__author__ = 'shisanjun' from multiprocessing import Process,Queue
import threading
import queue # def run(q):
# q.put([42,None,"hello"])
#
#
# if __name__=="__main__":
#
# q=Queue()
# p=Process(target=run,args=(q,))
# p.start()
# print(q.get()) """
正常进程间传递,把query当做参数传给子进程
想当于父进程克隆了一份数据给子进程
其他是两个q父进程q序列化保存在某个位置,子进程q在反序列化
""" def f():
q.put([42,None,"hello"]) # if __name__=="__main__":
#
# q=queue.Queue()
# p=threading.Thread(target=f,)
# p.start()
# print(q.get()) """
线程共享内存,所以可以访问q
""" # if __name__=="__main__":
#
# q=queue.Queue()
# p=Process(target=f,)
# p.start()
# print(q.get())
"""
name 'q' is not defined
主进程和子进程不能共享内存,所以不能用q
""" if __name__=="__main__": q=queue.Queue() #线程队列
p=Process(target=f,args=(q,))
p.start()
print(q.get()) """
TypeError: can't pickle _thread.lock objects
往线程里面放数据,他没有序列化,往进程里放数据
"""

2)Pipe

  Pipe()返回的对象代表管的两端。每个连接对象有send()和recv()方法(等等)。请注意,如果两个进程(或线程)试图同时读取或写入管道的同一端,则管道中的数据可能会损坏。当然,同时使用不同管端的过程不会有损坏的危险。

  

# -*- coding:utf-8 -*-
__author__ = 'shisanjun' from multiprocessing import Pipe,Process def f(conn):
conn.send([42,None,"hello"])
conn.close() if __name__=="__main__": parent_conn,child_conn=Pipe() #管道两边 p=Process(target=f,args=(child_conn,)) #管道一头 p.start() print("111%s" %parent_conn.recv())#管道另一头
p.join()

 3)managers

  一个managers返回的对象manager()控制服务器进程持有的Python对象,允许其它进程操控他们使用代理。  

  A manager returned by Manager() 支持类型 listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue and Array.

 

# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from multiprocessing import Process, Manager def f(d, l):
d[1] = '1'
d['2'] = 2
d[0.25] = None
l.append(1)
print(l) if __name__ == '__main__':
with Manager() as manager:
d = manager.dict() l = manager.list(range(5))
p_list = []
for i in range(10):
p = Process(target=f, args=(d, l))
p.start()
p_list.append(p)
for res in p_list:
res.join() print(d)
print(l)

  

4)区别

   queue,pipe:只适用于多个进程都是源于同一个父进程的情况

  manager如果多个进程不是源于同一个父进程

  Queue Pipe只是实现进程间数据的传递
  Manager实现了进程间数据的共享,即多个进程可以修改同一份数据

最新文章

  1. Deferred解决JS同步问题
  2. 【Java学习笔记】泛型
  3. Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的
  4. js 实现分割条
  5. Ant Table组件
  6. 我的MYSQL学习心得 mysql日志
  7. wpf CollectionViewSource的运用
  8. HDU - 5276 YJC tricks time
  9. iframe及与页面之间的通信
  10. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)
  11. 第四章 MySQL数据类型和运算符
  12. npm——安装教程、安装vue脚手架
  13. iframe之间操作记录
  14. P3648 [APIO2014]序列分割(斜率优化dp)
  15. hadoop MR的一些文件归属(包括临时文件存储情况)
  16. Druid 配置及内置监控,Web页面查看监控内容
  17. config、option、setting辨析
  18. ANSI 标准是为了确保 C++ 的便携性
  19. 使用git一张图就够了
  20. bzoj P3884 上帝与集合的正确用法

热门文章

  1. 解题:POI 2012 Well
  2. bzoj2300【HAOI2011】防线修建
  3. fzyzojP1876 天津——泥人张
  4. YBT 6 数学基础
  5. 18华南理工校赛 K 小马哥的超级盐水
  6. Java虚拟机性能监控与调优
  7. 使用tkinter做简单计算器
  8. 关于JSON的解析方式
  9. 视音频数据处理入门:UDP-RTP协议解析
  10. vsCode开发java遇到的问题整理、解决方案(持续更新)