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中的yield使用方法
Feb 11 Python
Python实例一个类背后发生了什么
Feb 09 Python
python SMTP实现发送带附件电子邮件
May 22 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
python 图像平移和旋转的实例
Jan 10 Python
Django处理多用户类型的方法介绍
May 18 Python
Pytorch释放显存占用方式
Jan 13 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
利用python 下载bilibili视频
Nov 13 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python如何修改文件时间属性
Feb 05 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防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
JS获取整个页面文档的实现代码
2011/12/15 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
jQuery增加自定义函数的方法
2015/07/18 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
python求列表交集的方法汇总
2014/11/10 Python
Python map和reduce函数用法示例
2015/02/26 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python3 深浅copy对比详解
2019/08/12 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
校长岗位职责
2013/11/26 职场文书
施工资料员岗位职责
2014/01/06 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
国王的演讲观后感
2015/06/03 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
python - asyncio异步编程
2021/04/06 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL