python网络编程-进程间数据通信(Queue,Pipe ,managers)
一:进程间数据交换方法
不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
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() 支持类型 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value 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)的更多相关文章
- Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)
进程与进程之间是相互独立的,互不干扰.如果多进程之间需要对同一资源操作,就需要进程间共享变量,上一篇文章介绍了进程间共享数据的三大类Value.Array.Manager,这三种类的主要区别在于管理的 ...
- python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型
1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...
- python网络编程--进程线程
一:什么是进程 一个程序执行时的实例被称为一个进程. 每个进程都提供执行程序所需的资源.一个进程有一个虚拟地址空间.可执行代码.对系统对象的开放句柄.一个安全上下文.一个独特的进程标识符.环境变量.一 ...
- python网络编程--进程池
一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...
- python网络编程-进程锁
一:进程锁的作用 进程锁是防止多进程并发执行在屏幕打印的时候,其他进程也输出数据到屏幕,而出现混乱现象. 比如:进程池中很多进程会向同一个日志文件中打印日志 二:代码 # -*- coding:utf ...
- Python并发编程-进程间数据共享
Manager中进程数据不安全 通过加锁解决 from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acq ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
随机推荐
- 【专题】字符串专题小结(AC自动机 + 后缀自动机)
AC自动机相关: $fail$树: $fail$树上以最长$border$关系形成父子关系,我们定一个节点对应的串为根到该节点的路径. 对于任意一个非根节点$x$,定$y = fa_{x}$,那$y$ ...
- Java的基本类型
基本数据类型的加载和存储 极客时间深入理解Java虚拟机读后感,有错误还请指正 虚拟机中的Boolean类型 在Java语言规范中,boolean类型的值只有两种可能,那就是"true&qu ...
- 怎样将Android SDK源码 导入到Eclipse中?
在Eclipse中导入android sdk源码 http://blog.csdn.net/hahahacff/article/details/8590649
- 解题:APIO 2012 派遣
题面 以报酬为标准维护一个大根堆,从根节点往上合并,每次踢掉若干人直到花费合法后更新答案 #include<cstdio> #include<cstring> #include ...
- 解题:Poetize6 IncDec Sequence
题面 差分原数列得到差分数组$dif$,这样对于$dif[2]->dif[n]$会多出来两个“空位置”$1$和$n+1$.然后区间加减就变成了使一个位置$+1$,另一个位置$-1$(可以对“空位 ...
- 【题解】Catering World Finals 2015 上下界费用流
Prelude 传送到Codeforces:0.0 Solution 板子题,在这里贴个板子. 这题面是smg?题面中有说每个点只能经过一次吗?是我瞎了吗? 因为这WA on test 27一个小时, ...
- HDU 3271 数位dp+二分
SNIBB Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Centos下Vim编辑器基本配置
设置 Vim编辑环境 配置 有两种方式: 1,是在/etc/vimrc 进行设置,这种设置方法会作用与所有登录到Linux环境下的用户.不建议使用. 2,在用户登录的 ~ 目录下创建一个 .vimrc ...
- python3.5无法安装pip,报错ImportError: cannot import name 'HTTPSHandler'
本人系统为:centos6 解决方法: 1 安装openssl yum install openssl 2 安装openssl-devel yum install openssl-devel 3 ...
- asp.net webapi http请求生命周期
先附上webapi http生命周期图. 原始的图片地址为:https://www.asp.net/media/4071077/aspnet-web-api-poster.pdf