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 相关文章推荐
简单解析Django框架中的表单验证
Jul 17 Python
读取本地json文件,解析json(实例讲解)
Dec 06 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
Python中property属性实例解析
Feb 10 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
python操作gitlab API过程解析
Dec 27 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Django REST Swagger实现指定api参数
Jul 07 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 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
1 Tube Radio
2021/03/02 无线电
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
php explode函数实例代码
2012/02/27 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
js命名空间写法示例
2015/12/18 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
Python的多维空数组赋值方法
2018/04/13 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
详解anaconda安装步骤
2020/11/23 Python
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
医学生实习自我鉴定
2013/09/27 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
酒店开业策划方案
2014/06/02 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
2015年企业工作总结范文
2015/04/28 职场文书