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中无限元素列表的实现方法
Aug 18 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
Python单例模式实例详解
Mar 01 Python
Python3学习urllib的使用方法示例
Nov 29 Python
python取代netcat过程分析
Feb 10 Python
python模块smtplib学习
May 22 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
Elasticsearch 基本查询和组合查询
Apr 19 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
用cookies来跟踪识别用户
2006/10/09 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
vue组件的写法汇总
2018/04/12 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
用js编写留言板
2020/03/17 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
Python中文件的读取和写入操作
2018/04/27 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
python保留小数位的三种实现方法
2020/01/07 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
电子商务专业推荐信范文
2013/12/02 职场文书
大学生自荐书范文
2013/12/10 职场文书
关于运动会的稿件
2014/02/02 职场文书
大学生秋游活动方案
2014/02/17 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
Python基础详解之邮件处理
2021/04/28 Python