一:进程间数据交换方法

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

  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实现了进程间数据的共享,即多个进程可以修改同一份数据

python网络编程-进程间数据通信(Queue,Pipe ,managers)的更多相关文章

  1. Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)

    进程与进程之间是相互独立的,互不干扰.如果多进程之间需要对同一资源操作,就需要进程间共享变量,上一篇文章介绍了进程间共享数据的三大类Value.Array.Manager,这三种类的主要区别在于管理的 ...

  2. python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型

    1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...

  3. python网络编程--进程线程

    一:什么是进程 一个程序执行时的实例被称为一个进程. 每个进程都提供执行程序所需的资源.一个进程有一个虚拟地址空间.可执行代码.对系统对象的开放句柄.一个安全上下文.一个独特的进程标识符.环境变量.一 ...

  4. python网络编程--进程池

    一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...

  5. python网络编程-进程锁

    一:进程锁的作用 进程锁是防止多进程并发执行在屏幕打印的时候,其他进程也输出数据到屏幕,而出现混乱现象. 比如:进程池中很多进程会向同一个日志文件中打印日志 二:代码 # -*- coding:utf ...

  6. Python并发编程-进程间数据共享

    Manager中进程数据不安全 通过加锁解决 from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acq ...

  7. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  8. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  9. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

随机推荐

  1. 51nod 1494 选举拉票 | 线段树

    51nod1494 选举拉票 题面 现在你要竞选一个县的县长.你去对每一个选民进行了调查.你已经知道每一个人要选的人是谁,以及要花多少钱才能让这个人选你.现在你想要花最少的钱使得你当上县长.你当选的条 ...

  2. Java的内存结构

    Java中的内存结构 运行时数据区域的划分: 程序计数器(PC寄存器) 程序计数器(Program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 ...

  3. PHP正则表达式函数学习

    正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些php正则表达式的用法. 一.php中常用的正则表达式函数 ...

  4. IEEE 754浮点数表示标准

    二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比 ...

  5. git<commit和分支>

    commit: 在执行提交命令git commit之前,一定要git add要修改的文件,这样才能将更改的内容更新到本地. 在Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内 ...

  6. 用递归的方法求一个数组的前n项和

    用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...

  7. C++中基于成员函数是否是const重载成员函数

    C++pimer中文版第四版 378页 基于const的重载 如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载.比如: ...

  8. windows下64位python的安装及机器学习相关包的安装(实用)

    开通博客已久,想了好久决定写个基础的安装教程,望后人少走弯路,也借此希望跟大家多多交流.文中给出的链接默认是基于对python2.7的前提下的包. 1.首先下载64位Python包,进行安装(默认py ...

  9. python 导入自定义模块

    1. 2.

  10. 视音频数据处理入门:PCM音频采样数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...