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接收多播数据的代码
Mar 01 Python
Python之eval()函数危险性浅析
Jul 03 Python
python实现多线程采集的2个代码例子
Jul 07 Python
Python制作CSDN免积分下载器
Mar 10 Python
详解在Python中处理异常的教程
May 24 Python
Python实现快速多线程ping的方法
Jul 15 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
Python中最大递归深度值的探讨
Mar 05 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
用PHP生成html分页列表的代码
2007/03/18 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
DIV菜单层实现代码
2010/11/19 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
简介JavaScript错误处理机制
2020/08/04 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python备份Mysql脚本
2008/08/11 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
python数据类型强制转换实例详解
2020/06/22 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
后勤副校长自我鉴定
2013/10/13 职场文书
学生实习介绍信
2014/01/15 职场文书
总裁助理岗位职责
2014/02/17 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
植树节口号
2014/06/21 职场文书
员工培训协议书
2014/09/15 职场文书
护士求职自荐信
2015/03/25 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书