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简单分割文件的方法
Jul 30 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
python调用OpenCV实现人脸识别功能
May 25 Python
Python使用googletrans报错的解决方法
Sep 25 Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
python 的topk算法实例
Apr 02 Python
python安装后的目录在哪里
Jun 21 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
python使用BeautifulSoup 解析HTML
Apr 24 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
网站当前的在线人数
2006/10/09 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
php生成微信红包数组的方法
2019/09/05 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
Django用户身份验证完成示例代码
2020/04/03 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
在校生自我鉴定
2014/01/23 职场文书
个人自我剖析材料
2014/02/07 职场文书
自荐书范文范例
2014/02/13 职场文书
客服专员岗位职责
2014/02/28 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
委托函范文
2015/01/29 职场文书
2015年项目工作总结
2015/04/29 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
Java使用jmeter进行压力测试
2021/07/09 Java/Android