Python官方文档

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()

注意:

1.对client获取的变量修改,不会影响server那边的变量,例如server中,client1获取变量params1,把它修改为params2,server那边的数据不会修改。如果要修改server的数据,需要调用server的方法,把server那边的数据刷新。

python manager详解_Python通过Manager方式实现多个无关联进程共享数据相关推荐

  1. python manager详解_python 多进程共享全局变量之Manager()详解

    Manager支持的类型有 list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和 ...

  2. python数据库环境详解_python中MySQL数据库相关操作

    一 安装基本环境 1 简介 MySQL 基于TCP 协议之上的开发,但是网络连接后,传输的数据必须遵循MySQL的协议,封装好MySQL协议的包,就是驱动程序 MySQL 的驱动 MySQLDB 最有 ...

  3. python录音详解_python音频处理的示例详解

    准备工作: 首先,我们需要 import 几个工具包,一个是 python 标准库中的 wave 模块,用于音频处理操作,另外两个是 numpy 和 matplot,提供数据处理函数. 一:读取本地音 ...

  4. python多线程详解_python基础:python多线程详解

    前言 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...

  5. unet网络python代码详解_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  6. python excel详解_Python - excel 详解

    Python读excel,2003用xlrd,2007和2010用openpyxl xlrd介绍:http://pypi.python.org/pypi/xlrd 转自:http://huaxia52 ...

  7. python递归详解_Python理解递归的方法总结

    递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...

  8. python学习详解_Python学习入门到精通:Python列表讲解

    列表导读 从列表开始,我们将陆续学习元组,集合,字典这4中容器类型数据.容器类型数据,只是望文生义,你大概能够猜测出这4种数据类型的作用,他们如同容器一样,可以存储int,float,bool,str ...

  9. python关键字详解_Python 中的关键字with详解

    在 Python 2.5 中,with关键字被加入.它将常用的 try ... except ... finally ...模式很方便的被复用.看一个最经典的例子: with open('file.t ...

最新文章

  1. JVM最多支持多少个线程?
  2. Linux系统管理基本操作
  3. 从前端角度来看网页设计
  4. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
  5. 【Python CheckiO 题解】Correct Sentence
  6. linux联想电脑wifi密码,联想笔记本Y7000—ubuntu16.4无法开启wifi的解决办法
  7. PHP笔记-所有错误统一输出404页面(详细错误日志输出,提高安全性)
  8. matlab的czt变换,CZT变换(chirp z-transform)
  9. 2.8 计算图的导数计算
  10. 让代码看起来更舒服(1):选择适合的配色方案 (转)
  11. 一文了解H5照片上传过程
  12. 概率论与数理统计 积分表(高等数学附录)
  13. 信息系统安全思维导图
  14. 用计算机怎么计算税率,一般纳税人税率计算器,一般纳税人税率如何计算?
  15. OSCS开源软件供应链安全社区上线,携手开源社区共同提升开源安全质量
  16. 大河奔流的精神 ——俞敏洪
  17. Hadoop-HDFS读文件
  18. 第六章 TCP/IP-网络传输硬件设备
  19. java 泛型向下转型_Java向上转型和向下转型(附具体样例)
  20. VC 6.0 好用的插件推荐

热门文章

  1. Grub及内核的简单介绍安装
  2. hadoop伪分布式安装
  3. [转载]xcode5时代如何设置Architectures和Valid Architectures
  4. .net数据控件的冒泡事件
  5. android:layout_with=,android – 难以理解layout_alignWithParentIfMissing
  6. startupinfo为什么需要初始化_为什么 TCP 建立连接要三次握手
  7. python截取html图片大小,Python打开html文件,截取屏幕截图,裁剪并保存为图像
  8. linux下redis安装教程,linux下安装配置redis图文详解
  9. php+tcc,64位Linux环境安装PHP TCC扩展方法
  10. python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...