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的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
python如何对链表操作
Oct 10 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 Python
pandas 操作 Excel操作总结
Mar 31 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 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
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
js禁止表单重复提交
2017/08/29 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
element-ui中按需引入的实现
2019/12/25 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python flask 多对多表查询功能
2017/06/25 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
python ubplot使用方法解析
2020/01/10 Python
Python更新所有已安装包的操作
2020/02/13 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
工程部经理岗位职责
2013/12/08 职场文书
大学生思想汇报范文
2013/12/31 职场文书
运动会跳远加油稿
2014/02/20 职场文书
初中班主任寄语
2014/04/04 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
画展观后感
2015/06/17 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android