多进程Queue
进程间通讯
不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
Queues
使用方法跟threading里的queue差不多
from multiprocessing import Process, Queue
#将子进程数据传给主进程
def f(yy):#子进程
yy.put([42, None, 'hello']) if __name__ == '__main__':#主进程
q = Queue()#生成进程Queue,线程Queue不行
p = Process(target=f, args=(q,))#将Queue传给子进程
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
#结果:[42, None, 'hello']
另一种方法:
Pipes
The Pipe()
function returns a pair of connection objects connected by a pipe which by default is duplex (two-way). For example:
from multiprocessing import Process, Pipe def f(conn):
conn.send([42, None, 'hello'])
conn.send(['I am your song'])
print(conn.recv(),'收到了!')
conn.close() if __name__ == '__main__':
parent_conn, child_conn = Pipe()#生成管道实例:parent_conn, child_conn分别为管道的两头
p = Process(target=f, args=(child_conn,))#管道一头传数据
p.start()
print(parent_conn.recv()) #管道另一头收数据 prints "[42, None, 'hello']"
print(parent_conn.recv()) #['I am your song']
# print(parent_conn.recv()) #如果一头只发了两次,另一头接受之后,还想接受一次,会卡主。比如发几次,收几次。
parent_conn.send('我也给你发条信息,你能收到吗?')
p.join()
结果:
[42, None, 'hello']
['I am your song']
我也给你发条信息,你能收到吗? 收到了!
以上只实现了数据的传递,要实现数据的共享,比如两个进程同时修改一份数据,该怎么办呢?
A manager object returned by Manager()
controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
A manager returned by Manager()
will support types list
, dict
, Namespace(变
量)
, Lock
, RLock
, Semaphore
, BoundedSemaphore
, Condition
, Event
, Barrier
, Queue
, Value
and Array
(manager支持很多很多格式的共享)
For example:
from multiprocessing import Process, Manager
import os
#多进程实现数据的共享:不需要加锁,
#因为manager已经自动加锁了,不允许多个进程同时修改一份数据,进程数据是独立的,
#比如共享字典数据,实际已经把字典copy了10(进程数量)份了,最终通过序列化和反序列化拟合在一起,所以数据不会乱。
def f(d, l):
d[1] = '1'#10个进程以同样的方式修改字典,结果里还是一样的值
d['2'] = 2
d[0.25] = None
l.append(os.getpid())#放10个进程里每个进程号
print('每个进程操作:',l) if __name__ == '__main__':
with Manager() as manager:#也可以写成 manager = Manager(),赋一个变量
d = manager.dict()#生成一个可在多个进程之间传递和共享的字典 l = manager.list(range(5))#生成一个可在多个进程之间传递和共享的列表
p_list = []#准备以后存多个进程
for i in range(10):#生成10个进程
p = Process(target=f, args=(d, l))#将值传给d,l
p.start()
p_list.append(p)
for res in p_list:#等待结果
res.join()
print('最终结果:')
print(d)
print(l)
结果:
各个进程操作: [0, 1, 2, 3, 4, 2108]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512, 4740]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512, 4740, 3476]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512, 4740, 3476, 1368]
各个进程操作: [0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512, 4740, 3476, 1368, 4360]
最终结果:
{1: '', '': 2, 0.25: None}
[0, 1, 2, 3, 4, 2108, 3048, 4840, 1600, 2156, 2512, 4740, 3476, 1368, 4360]
多进程Queue的更多相关文章
- 多进程 多进程queue
多进程 import multiprocessing import threading import time def thread_run(): print(threading.get_ident( ...
- Python自学day-10
一.多进程 程序中, 大量的计算占用CPU资源,而IO操作不占CPU资源.当程序需要进行大量计算时,Python采用多线程运行的速度不一定比单线程快多少.但是当程序是IO密集型的,那就应该使用多线程来 ...
- Python-进程-进程池-原理
进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...
- 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading
当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...
- Python 多进程编程之 进程间的通信(在Pool中Queue)
Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...
- Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...
- python 使用多进程实现并发编程/使用queue进行进程间数据交换
import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...
随机推荐
- 取消IE增强的安全配置
在window server里用ie各种信任添加很麻烦 可以通过如下方式取消IE增强设置: 如,在Server2008中,点击快速启动栏里面的服务器管理器图标,进入服务器管理器.选择配置 IE ESC ...
- hdoj5493【树状数组+二分】
题意: 给你n个人的高度, 再给出一个值代表该高度下有前面比他高的 或 后面比他高的人数, 求满足条件下的最小字典序, 不行的话输出"impossible" 思路: 对于最小字典序 ...
- 如何实现一个无边框Form的移动和改变大小(一)
很多时候我们不希望使用Windows提供的窗体. 我们希望使用一个无边框的窗体,什么border,caption透明就行了. 下面我们来说下一些实现方法. 这个方法要求窗体自定义的border siz ...
- [Swift]堆栈Stack:检索最小元素时间复杂度O(1)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Mol Cell Proteomics. |陈洁| 整合鸟枪法蛋白质组学中鉴定和定量的错误率
大家好,本周分享的是发表在MCP上的一篇关于鸟枪蛋白质组学中的错误率的文章,题目是Integrated identification and quantification error probabil ...
- Java 工程师面试题和笔试题整理(一)
根据自己之前收集的还有一部分自己面试的整理出来,希望能帮到面试的兄弟(2017). 海科融通 笔试题 1.有一个字符串,如果要在其中查找一个子串,都有哪些方式,写出你认为最好的一个. 2.写出线程都有 ...
- 有趣的JS存储 连等问题
五个月不见了,你是不是和我一样又帅了,今天我们先来看一道经典的关于JS存储的题目,来一场紧张又刺激的脑内吃鸡大战吧: var a = {n:1}; a.x = a = {n:2}; console.l ...
- sql server 数据库维护
select 'kill ',s.spid, sd.name, * from sys.sysprocesses sinner join sys.sysdatabases sd on s.dbid=sd ...
- Codeforces 1137D(技巧)
一开始写的第一步让0和1一起走然后第二步再让0走会挂最后一个点--然后探索一下觉得主要问题在于我模拟的一步一步地走.如果这样的话9 2这个数据会使第17步他俩就碰在final点了,而实际上我们想要的效 ...
- java如果去除中间空格,就不能用trim()这个方法了
public class Hello { public static void main(String[] args){ String text = "12v 4 6 5 55"; ...