分布式进程可以布置在局域网之中,把安排的任务注册到局域网内,不同主机之间就可以传递信息,从而分配任务和反馈,不过并不适合返回大量数据;
首先需要一个服务器server,用来存放数据,其他机器通过局域网内ip访问到:
# -*- coding: utf-8 -*- #注册进程,manager/server import multiprocessing from multiprocessing.managers import BaseManager from multiprocessing import freeze_support # 从BaseManager继承的QueueManager: class QueueManager(BaseManager): pass # 发送任务的队列: task_queue = multiprocessing.Queue() # 接收结果的队列: result_queue = multiprocessing.Queue() # 为解决__main__.<lambda> not found问题 def get_task_queue(): return task_queue # 为解决__main__.<lambda> not found问题 def get_result_queue(): return result_queue # 把两个Queue都注册到网络上, callable参数关联了Queue对象: QueueManager.register('get_task_queue', callable=get_task_queue) QueueManager.register('get_result_queue', callable=get_result_queue) # 绑定端口5000, 设置验证码'abc': manager = QueueManager(address=('192.168.10.138', 5000), authkey='abc') freeze_support() #manager.start() 不能正常运行时,使用以下方法作为进程通信服务器 server = manager.get_server() server.serve_forever()
使用server.serve_forever()来开启进程通信服务器,本身进程就阻塞了,永远地作为通信数据的存储进程。
其他进程可以访问、修改 服务器进程的通信数据来达到传输信息的目的。
# _*_ coding:utf-8 _*_ """ a work manager sample """ import Queue from multiprocessing.managers import BaseManager import time class QueueManager(BaseManager): pass # 从网络上获取Queue QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') # 连接服务器 server_addr = '192.168.10.141' print 'Connect to server %s ...' % server_addr manager = QueueManager(address=(server_addr, 5000), authkey='abc') manager.connect() # 获取Queue对象 task = manager.get_task_queue() result = manager.get_result_queue()
注意注册到服务器的ip和端口要和通信服务器端的一致。
局域网内各进程间接地通过 服务器来交换信息。