进程之间的数据共享 -----Manager模块
展望未来,基于消息传递的并发编程是大势所趋
即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据。
这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中。
但进程间应该尽量避免通信,即便需要通信,也应该选择进程安全的工具来避免加锁带来的问题。
以后我们会尝试使用数据库来解决现在进程之间的数据共享问题。
Manager 介绍
进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的
虽然进程间数据独立,但可以通过Manager实现数据共享,事实上Manager的功能远不止于此 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是一种较为高级的多进程通信方式,它能支持Python支持的的任何数据结构。
它的原理是:先启动一个ManagerServer进程,这个进程是阻塞的,它监听一个socket,然后其他进程(ManagerClient)通过socket来连接到ManagerServer,实现通信。
简单使用
from multiprocessing import Manager,Process
def func(dic):
dic['count'] = dic['count'] -1
print(dic) if __name__ == '__main__':
m = Manager() # 创建一个server进程
dic = m.dict({'count':100}) #这是一个特殊的字典
p = Process(target=func,args=[dic,])
p.start()
p.join()
再看循环修改的例子
from multiprocessing import Manager,Process
def func(dic):
dic['count'] = dic['count'] -1 # 每次减1 if __name__ == '__main__':
m = Manager() # 创建一个server进程
dic = m.dict({'count':100}) #这是一个特殊的字典
p_lst = [] # 定义一个空列表
for i in range(100): # 启动100个进程
p = Process(target=func,args=[dic,])
p_lst.append(p) # 进程追加到列表中
p.start() # 启动进程
for p in p_lst:p.join() # 等待100个进程全部结束
print(dic) # 打印dic的值
多执行几次就会发现,dic的值再 0 1 3之间变化,同一个时间内有多个进程操作dic,就会发生数据错乱
所以需要加锁,结果就固定为{'count': 0}
from multiprocessing import Manager, Process, Lock def func(dic, lock):
lock.acquire() # 取得锁
dic['count'] = dic['count'] - 1 # 每次减1
lock.release() # 释放锁 if __name__ == '__main__':
m = Manager() # 创建一个server进程
lock = Lock() # 创建锁
dic = m.dict({'count': 100}) # 这是一个特殊的字典
p_lst = [] # 定义一个空列表
for i in range(100): # 启动100个进程
p = Process(target=func, args=[dic, lock])
p_lst.append(p) # 进程追加到列表中
p.start() # 启动进程
for p in p_lst: p.join() # 等待100个进程全部结束
print(dic) # 打印dic的值
还有另外一种写法
from multiprocessing import Manager,Process,Lock
def func(dic,lock):
with lock: # 上下文管理 :必须有一个开始动作 和 一个结束动作的时候
dic['count'] = dic['count'] -1 # 每次减1 if __name__ == '__main__':
m = Manager() # 创建一个server进程
lock = Lock() #创建锁
dic = m.dict({'count':100}) #这是一个特殊的字典
p_lst = [] # 定义一个空列表
for i in range(100): # 启动100个进程
p = Process(target=func,args=[dic,lock])
p_lst.append(p) # 进程追加到列表中
p.start() # 启动进程
for p in p_lst:p.join() # 等待100个进程全部结束
print(dic) # 打印dic的值
使用:同一台机器上:使用 Queue
不同机器上,使用消息中间件
进程之间的数据共享 -----Manager模块的更多相关文章
- manager 实现进程之间的数据共享 list dict
manager 能够实现进程之间的数据共享 (list,dict) 如果多个进程同事修改同一份共享数据,这个时候需要加锁,保证数据的准确性. (1) dict list 可以实现进程之间的数据共享 ( ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- 探讨下在Delphi里面进程之间的数据共享
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.现在小编就和大家来探讨一下在Delphi ...
- 【Linux 进程】之关于父子进程之间的数据共享分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...
- python进程之间修改数据[Manager]与进程池[Pool]
#前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...
- python 进程之间的数据共享
from multiprocessing import Process,Manager import os def f(d,n): d[os.getpid()] = os.getppid()#对字典d ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
随机推荐
- [LeetCode&Python] Problem 566. Reshape the Matrix
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
- BZOJ4310: 跳蚤 【后缀数组+二分】
Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究.首先,他会把串 分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典 ...
- LeetCode-Microsoft-Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- oracle nodejs 访问
1. 下载node-oracle网址如下: https://github.com/joeferner/node-oracle 2. 测试代码: var oracle = require('oracle ...
- 笔记本设置 2K 显示屏 Intel HD Graphics 3000
收了一台 32英寸的显示器,接到笔记 本只有 1920x1080,心想没得救了,要换笔记本才能用了. 在网上找了一圈,找到一篇说 Intel HD Graphics 3000 可以支持到 2560x1 ...
- 标 题: 有什么办法快速把pc上的网址发送到手机上
标 题: 有什么办法快速把pc上的网址发送到手机上 transfer2u, pushbullet都可以实现你说的功能,还可以把图片或者选中内容/剪贴板内容发送到手机.后者功能更强,还支持在电脑之间发 ...
- linux ssh公钥免密码登录
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 一.SSH公钥登录原理 在平时工作中我们经常要远程登录服务器,这就要用到SSH ...
- Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) CRM 登录出现会话超时的解决办法
一.IFD 登录的时候,过了一段时间,会马上出现“您的会话已过期”,怎么解决这个问题呢,可以通过改变这个时间.具体图如二 Link to Dynamics CRM Wiki Home Page 二.S ...
- 使用nat123实现远程桌面
使用nat123实现动态IP或无公网IP时外网访问内网固定端口 使用环境:window7 1.安装nat123软件, 下载地址为 http://www.nat123.com/Pages_2_32.js ...
- jquery dataTable的学习
http://www.cnblogs.com/nier/archive/2012/03/19/2406450.html 分页 bPaginite:true;是否启用分页功能 sPaginationTy ...