python learning the job notes thirteen

Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/QWERTY1994/article/details/81906257

Distributed process

Primary process

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2018/8/21 11:07
# @Author   :

# 分布式进程
import random, time, queue
from multiprocessing import managers

# 发送任务的队列
task_queue = queue.Queue()
# 接收结果的队列
result_queue = queue.Queue()


# 从BaseManager集成的QueueManager
class QueueManager(managers.BaseManager):
    pass


def get_task_queue():
    global task_queue
    return task_queue


def get_result_queue():
    global result_queue
    return result_queue


if __name__ == '__main__':

    # 把每个Queue都注册到网络上 ,callable参数关联了Queue对象:
    # 参数一 其他进程获取的方法名称
    # QueueManager.register('get_task_queue', callable=lambda: task_queue) #windows此处不支持lambda表达式
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=get_task_queue)
    QueueManager.register('get_result_queue', callable=get_result_queue)

    # 这个进程负责将两个队列暴露到网络上 ,所以ip不需要填写
    # 绑定 ip本机  端口 5000 ,设置验证码 abc 特别注意验证码是二进制的数据,要编码
    manager = QueueManager(address=('127.0.0.1', 5000), authkey='郑震'.encode('utf-8'))

    # 启动queue
    manager.start()
    # 获得通过网络访问的Queue对象
    task = manager.get_task_queue()
    result = manager.get_result_queue()

    # 放几个任务到队列
    for i in range(10):
        n = random.randint(0, 1000)
        print('Put task %d ..' % n)
        task.put(n)
        # 将result队列读取结果:
    task.put('end') # 表示任务结束
    while True:
        r = result.get(timeout=10)
        print('Result:%s' % r)
        if r == 'end': #当分布式进程发送结束信息 表示任务结束  可以退出来了
            break

    # 关闭
    manager.shutdown()
    print('master exit.')

Sub-process

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2018/8/21 11:07
# @Author   :

# 分布式进程
import time, sys, queue
from multiprocessing.managers import BaseManager


# 创建类似的QueueManag
class QueueManage(BaseManager):
    pass


# 这个进程只要从网络上获取两个队列 ,所以只要提供名称就可以了
QueueManage.register('get_task_queue')
QueueManage.register('get_result_queue')

manage = QueueManage(address=('127.0.0.1', 5000), authkey='郑震'.encode('utf-8'))
# 链接网络 获取暴露的数据
manage.connect()
task = manage.get_task_queue()
result = manage.get_result_queue()

# 从队列中获取任务
while True:
    try:
        n = task.get(timeout=1)
        if n == 'end':
            result.put('end')
            break  # 结束
        print('run task %d * %d..' % (n, n))
        r = '%d * %f = %d' % (n, n, n * n)
        result.put(r)  # 往结果队列写
        time.sleep(1)
    except queue.Empty:
        print('task queue is empty')

# 处理结束
print('worker exit.')

 

Guess you like

Origin blog.csdn.net/QWERTY1994/article/details/81906257