python分布式进程模型
2015-05-20 00:53
281 查看
分布式进程:Process进程分布到多台机器上
Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。
可以写一个服务进程作为调度者,将任务分布到其他多个进程中,依靠网络通信进行管理。
另外值得注意的是,manager和worker两端创建的实例是相关的,即worker的实例,通过验证码和网络IP地址连接到manager即服务器的实例。
参考文档:https://docs.python.org/2/library/multiprocessing.html?highlight=basemanager#multiprocessing.sharedctypes.multiprocessing.Manager
Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。
可以写一个服务进程作为调度者,将任务分布到其他多个进程中,依靠网络通信进行管理。
另外值得注意的是,manager和worker两端创建的实例是相关的,即worker的实例,通过验证码和网络IP地址连接到manager即服务器的实例。
# -*- coding:utf-8 -*- #taskmanager.py ''' 1.建立队列,作为共享消息的通道。 服务进程 任务队列task_queue作为服务进程传递任务给任务进程的通道,而结果队列result_queue作为任务进程完成任务后回传给服务进程的通道。 值得注意的是,在【一台机器上】写多进程程序时,创建的Queue可以直接拿来用 然而,在分布式多进程环境下,不可以直接添加任务到原始的task_queue,那样就绕过了Queuemanager的封装, 必须通过manager.get_task_queue()获得的【Queue接口】添加任务。 2.把1.中建立的队列在网络上注册,暴露给其他进程(主机),注册后获得【网络队列】(可以认为是1.中队列的'映像') 3.建立一个对象(Queuemanager(BaseManager))实例manager,绑定端口和验证码 4.启动3.中建立的实例,以便监听连接(启动管理 manager,监管信息通道) 5.通过管理实例的方法获得通过网络访问的Queue对象,即再把网络队列实体化成可以使用的本地队列(通过本地上传到网络) 6.创建任务到“本地”队列中,自动上传任务到网络队列中,以供分配给 ''' import random,time,Queue from multiprocessing.managers import BaseManager #建立两个队列,分别存放任务和结果,它们用来进行进程间通信,交换对象。换言之,这两个队列就是交换对象 task_queue=Queue.Queue() result_queue=Queue.Queue() class Queuemanager(BaseManager): pass #把创建的两个队列注册在网络上,利用register方法,callable参数关联了Queue对象 #typeid is a “type identifier”(类型标识符) which is used to identify a particular type of shared object. This must be a string. #callable is a callable used for creating objects for this type identifier.——后者用来创建前者,后者是具体的对象,而前者是利用后者创造出来的“影子” Queuemanager.register('get_task_queue',callable=lambda:task_queue) Queuemanager.register('get_result_queue',callable=lambda:result_queue) #绑定端口5000,设置验证码‘abc’。这个相当于对象的初始化 #address is the address on which the manager process listens for new connections manager=Queuemanager(address=('',5000),authkey='abc') #启动管理 manager.get_server().serve_forever() #通过管理实例的方法获得通过网络访问的Queue对象 task=manager.get_task_queue() result=manager.get_result_queue() #放几个任务进去 for i in range(10): n=random.randint(0,10000) print 'put task %d ...' %n task.put(n) #task是本地队列 print 'try get result...' for i in range(10): print 'result is %s' %result.get(timeout=10) #关闭管理 manager.shutdown()
# taskworker.py import time, sys, Queue from multiprocessing.managers import BaseManager # 创建类似的QueueManager: class QueueManager(BaseManager): pass # 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字: QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') # 连接到服务器,也就是运行taskmanager.py的机器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和验证码注意保持与taskmanager.py设置的完全一致: m = QueueManager(address=(server_addr, 5000), authkey='abc') # 从网络连接: m.connect() # 获取Queue的对象: task = m.get_task_queue() result = m.get_result_queue() # 从task队列取任务,并把结果写入result队列: for i in range(10): try: n = task.get(timeout=1) print('run task %d * %d...' % (n, n)) r = '%d * %d = %d' % (n, n, n*n) time.sleep(1) result.put(r) except Queue.Empty: print('task queue is empty.') # 处理结束: print('worker exit.')
参考文档:https://docs.python.org/2/library/multiprocessing.html?highlight=basemanager#multiprocessing.sharedctypes.multiprocessing.Manager
相关文章推荐
- Python基础-分布式进程 Master/Worker模型
- python 分布式 进程 | windows
- python 分布式进程
- Python 分布式进程Master
- Python进阶(5)_进程与线程之协程、I/O模型
- python 分布式进程体验
- Python之多进程、多线程、协程和分布式进程
- Python 分布式进程Worker
- Python3之进程生产者消费者模型(important)
- python分布式进程传送脚本文件并执行
- 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程
- Python3中的分布式进程
- python学习——分布式进程
- Python 分布式进程
- python分布式进程
- python 分布式进程体验
- python进阶之多线程(进程)同步执行的消费者与生产者模型
- Python3 下分布式进程的简单应用
- python分布式进程(windows下)
- Python Windows下分布式进程的坑(分布式进程的一个简单例子)