python 学习 -- 分布式进程

来源:互联网 发布:jquery数组去掉字符串 编辑:程序博客网 时间:2024/05/22 06:58
服务器端:
import random,time,queuefrom multiprocessing.managers import BaseManager# 发送任务的队列task_queue = queue.Queue()# 接收结果的队列result_queue = queue.Queue()class QueueManager(BaseManager):    pass# 定义一个返回task_queue的函数def return_task_queue():    global task_queue    return task_queue# 定义一个返回结果队列的函数def return_result_queue():    global result_queue    return result_queue# 测试函数def test():    # 将两个queue注册到网络上    QueueManager.register('get_task_queue', callable=return_task_queue)    QueueManager.register('get_result_queue', callable=return_result_queue)    # 绑定端口,同时设置验证码    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')    # 启动queue    manager.start()    # 获得通过网络访问的queue对象    task = manager.get_task_queue()    result = manager.get_result_queue()    # 放几个任务进去    for i in range(10):        n = random.randint(0, 100)        print('Put task %d...' % n)        task.put(n)    # 从result队列中取出结果    print("Try get results...")    for i in range(10):        r = result.get(timeout=10)        print("Result: %s" % r)    # 关闭(之前一直阻塞)    manager.shutdown()    print("master exit.")# main函数if __name__=="__main__":    test()


测试端:

import time,sys,queuefrom multiprocessing.managers import BaseManagerclass QueueManager(BaseManager):    pass# 从网络上获取queue ,注册时候提供名字QueueManager.register('get_task_queue')QueueManager.register('get_result_queue')# 连接到服务器server_addr = '127.0.0.1'print('Connect to server %s...' % server_addr)m = QueueManager(address=(server_addr,5000),authkey=b'abc')m.connect()# 获取queue对象task = m.get_task_queue()result = m.get_result_queue()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 BaseException:        print('error')print("worker exit.")


0 0