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 相关文章推荐
Python3实现发送QQ邮件功能(html)
Dec 15 Python
简述Python2与Python3的不同点
Jan 21 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
解决Python安装后pip不能用的问题
Jun 12 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
numpy np.newaxis 的实用分享
Nov 30 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
Python离线安装各种库及pip的方法
Nov 28 Python
Python 实现RSA加解密文本文件
Dec 30 Python
conda安装tensorflow和conda常用命令小结
Feb 20 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和ACCESS写聊天室(十)
2006/10/09 PHP
php adodb分页实现代码
2009/03/19 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
php轻松实现文件上传功能
2016/03/03 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
Javascript 解疑
2009/11/11 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python记录程序运行时间的三种方法
2017/07/14 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
英文导游欢迎词
2014/01/11 职场文书
教师自我鉴定范文
2014/03/20 职场文书
精神文明单位申报材料
2014/05/02 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
Golang 入门 之url 包
2022/05/04 Golang