【代码】廖雪峰Python教程,简单分布式进程

分布式Master进程
# task_master.py

import random, queue
from multiprocessing.managers import BaseManager

#发送任务的队列
data_queue = queue.Queue()

#接受结果的队列
result_queue = queue.Queue()


#BaseManager继承的QueueManager
class QueueManager(BaseManager):
    pass


def return_data_queue():
    global data_queue
    return data_queue


def return_result_queue():
    global result_queue
    return result_queue


def run():
    #把两个Queue都注册到网络上, callable参数关联了Queue对象
    QueueManager.register("get_data_queue", callable=return_data_queue)
    QueueManager.register("get_result_queue", callable=return_result_queue)

    #还可从实例中注册
    #manager.register("get_data_queue", callable=return_data_queue)
    #manager.register("get_result_queue", callable=return_result_queue)

    #绑定端口5000, 设置验证码'abc'
    manager = QueueManager(address=("127.0.0.1", 5000), authkey=b"shabi")

    manager.start()
    # 获得通过网络访问的Queue对象
    data = manager.get_data_queue()
    result = manager.get_result_queue()

    #放入任务

    for i in range(10):
        n = random.randint(0,100)
        print("put {} in data".format(n))
        data.put(n)

    #读取结果
    print("try get results...")
    for i in range(10):
        r = result.get(timeout=10)
        print("result is {}".format(r))

    manager.shutdown()
    print("master exit")

if __name__ == '__main__':
    run()

分布式Worker进程
# task_worker.py

import time
from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
    pass

# 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字:
QueueManager.register("get_data_queue")
QueueManager.register("get_result_queue")

# 连接到服务器,也就是运行task_master.py的机器:
server_addr = "127.0.0.1"
print("connect to server {}".format(server_addr))

m = QueueManager(address=(server_addr, 5000),authkey=b"shabi")

m.connect()

# 获取Queue的对象:
data = m.get_data_queue()
result = m.get_result_queue()

# task队列取任务,并把结果写入result队列
for i in range(10):
    try:
        n = data.get(timeout=1)
        print("run task {} * {}".format(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")




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值