Python通过Manager方式实现多个无关联进程共享数据的实现


Posted in Python onNovember 07, 2019

Python实现多进程间通信的方式有很多种,例如队列,管道等。

但是这些方式只适用于多个进程都是源于同一个父进程的情况。

如果多个进程不是源于同一个父进程,只能用共享内存,信号量等方式,但是这些方式对于复杂的数据结构,例如Queue,dict,list等,使用起来比较麻烦,不够灵活。

Manager是一种较为高级的多进程通信方式,它能支持Python支持的的任何数据结构。

它的原理是:先启动一个ManagerServer进程,这个进程是阻塞的,它监听一个socket,然后其他进程(ManagerClient)通过socket来连接到ManagerServer,实现通信。

manager.py代码,实现server和client两个类

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
'''
进程间通信
'''
from multiprocessing.managers import BaseManager
from multiprocessing import RLock

MANAGER_PORT = 6000
MANAGER_DOMAIN = '0.0.0.0'
MANAGER_AUTH_KEY = 'aaaaaaaaaaaaaaa'

#定义一个Manager类
class InfoManager(BaseManager): pass


class DictItem():
  def __init__(self, ):
    self.items = dict()

  def set(self, key, value):
    self.items[key] = value

  def get(self, key):
    return self.items.get(key)

  def __setitem__(self, key, value):
    self.set(key, value)

#为这个manager类注册存储容器,也就是通过这个manager类实现的共享的变量,
#这个变量最好是一个类实例,自己定义的或者python自动的类的实例都可以
#这里不能把d改成dict(),因为Client那边执行d['keyi']='value'的时候会报错:d这个变量不能修改
d = DictItem()
lock = RLock()
InfoManager.register('dict', callable=lambda: d)
InfoManager.register('open_qq_login_lock', callable=lambda: lock)


class ManagerServer():
  '''
  multiprocess Manager服务类
  '''

  def __init__(self, domain, port, auth_key):
    self.domain = domain
    self.port = port
    self.auth_key = auth_key

  def start_manager_server(self):
    self.queue_manager = InfoManager(address=('', self.port), authkey=self.auth_key)
    # self.dict = self.queue_manager.dict()
    self.server = self.queue_manager.get_server()

  def run(self):
    self.start_manager_server()
    self.server.serve_forever()

  def stop(self):
    self.server.shutdown()
    self.is_stop = 1


class ManagerClient():
  '''
  访问mutiprocess Manager的类
  '''

  def __init__(self, domain, port, auth_key):
    self.domain = domain
    self.port = port
    self.auth_key = auth_key
    # self.get_share_dict()
    self.info_manager = InfoManager(address=(self.domain, self.port), authkey=self.auth_key)
    self.info_manager.connect()

  def get_dict(self):
    # self.dict = m.dict()
    self.dict = self.info_manager.dict()
    return self.dict

  def get_open_qq_login_lock(self):
    self.open_qq_login_lock = self.info_manager.open_qq_login_lock()
    return self.open_qq_login_lock


if __name__ == '__main__':
  pass

用法

1.启动一个ManagerServer,这个进程是阻塞的

import manager

def run():
  manager_server = manager.ManagerServer(manager.MANAGER_DOMAIN, manager.MANAGER_PORT, manager.MANAGER_AUTH_KEY)
  manager_server.run()
if __name__ == '__main__':
  run()

2.实例化一个client,获取共享的变量

# 进程间共享变量
manager_client = manager.ManagerClient(manager.MANAGER_DOMAIN, manager.MANAGER_PORT, manager.MANAGER_AUTH_KEY)
share_dict = manager_client.get_dict()
open_qq_login_lock = manager_client.get_open_qq_login_lock()

注意:

对client获取的变量修改,不会影响server那边的变量,例如server中,client1获取变量params1,把它修改为params2,server那边的数据不会修改。如果要修改server的数据,需要调用server的方法,把server那边的数据刷新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
Python回调函数用法实例详解
Jul 02 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
Python连接phoenix的方法示例
Sep 29 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
django中related_name的用法说明
May 20 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 #Python
Python中xml和dict格式转换的示例代码
Nov 07 #Python
python对象转字典的两种实现方式示例
Nov 07 #Python
python多线程高级锁condition简单用法示例
Nov 07 #Python
python文件操作的简单方法总结
Nov 07 #Python
详解Django admin高级用法
Nov 06 #Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 #Python
You might like
一个查看session内容的函数
2006/10/09 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
详解参数传递四种形式
2015/07/21 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
python中List的sort方法指南
2014/09/01 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
财务人员个人求职信范文
2013/12/04 职场文书
军训考核自我鉴定
2014/02/13 职场文书
节约用电标语
2014/06/17 职场文书
人民的好儿女观后感
2015/06/18 职场文书
采购员工作总结范文
2015/08/12 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js