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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python 字典与字符串的互转实例
Jan 13 Python
python实现用户管理系统
Jan 10 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
python 图片去噪的方法示例
Jul 09 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python同步两个文件夹下的内容
Aug 29 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Vs Code中8个好用的python 扩展插件
Oct 12 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
python基础学习之递归函数知识总结
May 26 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 MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
php中使用GD库做验证码
2016/03/31 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
《夜晚的实验》教学反思
2014/02/19 职场文书
公司会议策划方案
2014/05/17 职场文书
主要负责人任命书
2014/06/06 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS