多进程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 ...
随机推荐
- Spring入门(四):使用Maven管理Spring项目
让我们先回顾下本系列的前3篇博客: Spring入门(一):创建Spring项目 Spring入门(二):自动化装配bean Spring入门(三):通过JavaConfig装配bean 1.为什么要 ...
- STL——pair
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问. #include <bits/stdc++ ...
- Codeforces 67A【模拟】
题意: 给一个字符串代表相邻学生的比较,L代表左边多,R表示右边多,=表示左右相等. 保证每个人拿糖>=1,在分糖最少的情况下,输出每个学生所分得的糖. 思路: 模拟一下,第一个人一开始拿1个, ...
- Mecanim动画系统 - 在角色上使用Mask 叠加动画层
http://www.narkii.com/club/thread-305706-1.html 2013-10-9 01:15 上传 下载附件 (78.65 KB) 导读:五分钟了解Mecanim角色 ...
- Inside Geometry Instancing(上)
Inside Geometry Instancing(上) http://blog.csdn.net/soilwork/article/details/598335 翻译:claymanclayman ...
- [Xcode 实际操作]九、实用进阶-(18)图像人脸识别:对图片中的人像进行面部检测
目录:[Swift]Xcode实际操作 本文将演示对图片中的人像,进行面部检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //导入 ...
- 原生js回到顶部
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- GenericKeychain
KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上 下载了GenericKeychain项目后,只需要把“ ...
- day03 内部类
- 根据select中选定option触发不同事件
做公司项目,要实现一个小需求,根据下拉框选定的数据,绑定不同的事件.我的思路是获取select下面的option值,然后给它们定义不同的点击事件,但是在使用中option不能添加类,同时没有click ...