python3学习笔记之多进程分布式小例子


Posted in Python onFebruary 13, 2018

最近一直跟着廖大在学Python,关于分布式进程的小例子挺有趣的,这里做个记录。

分布式进程

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

master服务端原理:通过managers模块把Queue通过网络暴露出去,其他机器的进程就可以访问Queue了
服务进程负责启动Queue,把Queue注册到网络上,然后往Queue里面写入任务,代码如下:

#task_master.py
#coding=utf-8

#多进程分布式例子
#服务器端

from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support #server启动报错,提示需要引用此包
import random,time,queue

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

#从BaseManager继承的QueueManager
class QueueManager(BaseManager):
  pass
#win7 64 貌似不支持callable下调用匿名函数lambda,这里封装一下
def return_task_queue():
  global task_queue
  return task_queue
def return_result_queue():
  global result_queue
  return result_queue

def test():
  #把两个Queue注册到网络上,callable参数关联了Queue对象
  #QueueManager.register('get_task_queue',callable=lambda:task_queue)
  #QueueManager.register('get_result_queue',callable=lambda:result_queue)
  QueueManager.register('get_task_queue',callable=return_task_queue)
  QueueManager.register('get_result_queue',callable=return_result_queue)
  #绑定端口5000,设置验证码‘abc'
  manager = QueueManager(address=('127.0.0.1',5000),authkey=b'abc')#这里必须加上本地默认ip地址127.0.0.1
  #启动Queue
  manager.start()
  #server = manager.get_server()
  #server.serve_forever()
  print('start server master')
  #获得通过网络访问的Queue对象
  task = manager.get_task_queue()
  result = manager.get_result_queue()
  #放几个任务进去
  for i in range(10):
    n = random.randint(0,10000)
    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')

if __name__ == '__main__':
  freeze_support()
  test()

运行截图如下:

python3学习笔记之多进程分布式小例子

在分布式多进程环境下,添加任务到Queue不可以直接对原始的task_queue进行操作,那样就绕过了QueueManager的封装,必须通过manager.get_task_queue()获得的Queue接口添加。

任务进程,代码如下:

#task_worker.py
#coding=utf-8

#多进程分布式例子
#非服务端:worker

import time,sys,queue
from multiprocessing.managers import BaseManager

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

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

#连接到服务器,也就是运行task_master.py的机器
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()
#从task队列获取任务,并把结果写入result队列
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 queue.Empty:
    print('task queue is empty')
#处理结果
print('worker exit')

 运行截图如下:

python3学习笔记之多进程分布式小例子

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
python和ruby,我选谁?
Sep 13 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
Python的多维空数组赋值方法
Apr 13 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 #Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 #Python
20个常用Python运维库和模块
Feb 12 #Python
使用python实现BLAST
Feb 12 #Python
You might like
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
一个简单实现多条件查询的例子
2006/10/09 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
PDO::inTransaction讲解
2019/01/28 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
详解Python的Lambda函数与排序
2016/10/25 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
解决Python3下map函数的显示问题
2019/12/04 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
python动态规划算法实例详解
2020/11/22 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
学期评语大全
2014/04/30 职场文书
学用政策心得体会
2014/09/10 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Nginx 匹配方式
2022/05/15 Servers
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript