进程间通讯

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

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']
我也给你发条信息,你能收到吗? 收到了!

以上只实现了数据的传递,要实现数据的共享,比如两个进程同时修改一份数据,该怎么办呢?

Managers

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 listdictNamespace(变量)LockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue 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的更多相关文章

  1. 多进程 多进程queue

    多进程 import multiprocessing import threading import time def thread_run(): print(threading.get_ident( ...

  2. Python自学day-10

    一.多进程 程序中, 大量的计算占用CPU资源,而IO操作不占CPU资源.当程序需要进行大量计算时,Python采用多线程运行的速度不一定比单线程快多少.但是当程序是IO密集型的,那就应该使用多线程来 ...

  3. Python-进程-进程池-原理

    进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...

  4. 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading

    当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...

  5. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  6. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  7. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  8. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  9. python 使用多进程实现并发编程/使用queue进行进程间数据交换

    import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...

随机推荐

  1. Spring入门(四):使用Maven管理Spring项目

    让我们先回顾下本系列的前3篇博客: Spring入门(一):创建Spring项目 Spring入门(二):自动化装配bean Spring入门(三):通过JavaConfig装配bean 1.为什么要 ...

  2. STL——pair

    功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问. #include <bits/stdc++ ...

  3. Codeforces 67A【模拟】

    题意: 给一个字符串代表相邻学生的比较,L代表左边多,R表示右边多,=表示左右相等. 保证每个人拿糖>=1,在分糖最少的情况下,输出每个学生所分得的糖. 思路: 模拟一下,第一个人一开始拿1个, ...

  4. Mecanim动画系统 - 在角色上使用Mask 叠加动画层

    http://www.narkii.com/club/thread-305706-1.html 2013-10-9 01:15 上传 下载附件 (78.65 KB) 导读:五分钟了解Mecanim角色 ...

  5. Inside Geometry Instancing(上)

    Inside Geometry Instancing(上) http://blog.csdn.net/soilwork/article/details/598335 翻译:claymanclayman ...

  6. [Xcode 实际操作]九、实用进阶-(18)图像人脸识别:对图片中的人像进行面部检测

    目录:[Swift]Xcode实际操作 本文将演示对图片中的人像,进行面部检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //导入 ...

  7. 原生js回到顶部

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. GenericKeychain

    KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上 下载了GenericKeychain项目后,只需要把“ ...

  9. day03 内部类

  10. 根据select中选定option触发不同事件

    做公司项目,要实现一个小需求,根据下拉框选定的数据,绑定不同的事件.我的思路是获取select下面的option值,然后给它们定义不同的点击事件,但是在使用中option不能添加类,同时没有click ...