分布式进程
主进程
#!/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.')
分进程
#!/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.')