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 21 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
20行python代码实现人脸识别
May 05 Python
python实现串口自动触发工作的示例
Jul 02 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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 管理系统程序中的后门
2009/08/05 PHP
PHP运行模式的深入理解
2013/06/03 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
python开发之文件操作用法实例
2015/11/13 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
意大利团购网站:Groupon意大利
2016/10/11 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
新闻记者个人求职的自我评价
2013/11/28 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
购房意向书
2014/04/01 职场文书
爱护公物主题班会
2015/08/17 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS