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中for循环和while循环的基本使用方法
Aug 21 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Django实现网页分页功能
Oct 31 Python
Python列表解析操作实例总结
Feb 26 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 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
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
php去掉文件前几行的方法
2015/07/29 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
Python的iOS自动化打包实例代码
2018/11/22 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
使用python求解二次规划的问题
2020/02/29 Python
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
资深生产主管自我评价
2013/09/22 职场文书
企业车辆管理制度
2014/01/24 职场文书
一个都不能少观后感
2015/06/04 职场文书
合作协议书格式范本
2016/03/21 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库