python分布式进程

分布式进程可以布置在局域网之中,把安排的任务注册到局域网内,不同主机之间就可以传递信息,从而分配任务和反馈,不过并不适合返回大量数据;

首先需要一个服务器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和端口要和通信服务器端的一致。

局域网内各进程间接地通过 服务器来交换信息。