Python如何快速实现分布式任务


Posted in Python onJuly 06, 2017

深入读了读python的官方文档,发觉Python自带的multiprocessing模块有很多预制的接口可以方便的实现多个主机之间的通讯,进而实现典型的生产者-消费者模式的分布式任务架构。

之前,为了在Python中实现生产者-消费者模式,往往就会选择一个额外的队列系统,比如rabbitMQ之类。此外,你有可能还要设计一套任务对象的序列化方式以便塞入队列。如果没有队列的支持,那不排除有些同学不得不从socket服务器做起,直接跟TCP/IP打起交道来。

其实multiprocessing.managers中有个BaseManager就为开发者提供了这样一个快速接口。

我们假定的场景是1个生产者(producer.py)+8个消费者(worker.py)的系统,还有一个中央节点负责协调(server.py)实现如下:

server.py

from multiprocessing.managers import BaseManager
import Queue

queue = Queue.Queue() #初始化一个Q,用于消息传递
class QueueManager(BaseManager):
  pass

QueueManager.register('get_queue', callable=lambda:queue) # 在系统中发布get_queue这个业务

if __name__ == '__main__':
  m = QueueManager(address=('10.239.85.193', 50000),authkey='abr' )
 # 监听所有10.239.85.193的50000口
  s = m.get_server()
  s.serve_forever()

worker.py

from multiprocessing.managers import BaseManager
from multiprocessing import Pool


class QueueManager(BaseManager):
 pass

QueueManager.register('get_queue') 

def feb(i): #经典的'山羊增殖'
  if i < 2: return 1
  if i < 5 : return feb(i-1) + feb(i-2)
  return feb(i-1) + feb(i-2) - feb(i-5)

def worker(i): 
  m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
#连接server
  m.connect()
  while True:
    queue = m.get_queue()
# 获取Q
   c = queue.get()
 print feb(c)

if __name__ == '__main__':

  p = Pool(8) # 分进程启动8个worker
  p.map(worker, range(8))
producer.py

from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
  pass
QueueManager.register('get_queue')


if __name__ == '__main__':
 m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
 m.connect()
 i = 0
 while True:
   queue = m.get_queue()
   queue.put(48)

   i+=1

系统会直接将Queue() 对象中的数据直接封装后通过TCP 50000端口在主机之间传递。不过需要注意的是,由于authkey的缘故,各个节点要求python的版本一致。

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

Python 相关文章推荐
python操作MySQL数据库具体方法
Oct 28 Python
python之import机制详解
Jul 03 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
python随机模块random的22种函数(小结)
May 15 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
python实现web邮箱扫描的示例(附源码)
Mar 30 Python
Python编写nmap扫描工具
Jul 21 Python
微信小程序调用python模型
Apr 21 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 #Python
Python标准库sched模块使用指南
Jul 06 #Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 #Python
基于Python的关键字监控及告警
Jul 06 #Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 #Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 #Python
利用python实现简单的循环购物车功能示例代码
Jul 05 #Python
You might like
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
详解如何在vue中使用sass
2017/06/21 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
js实现小星星游戏
2020/03/23 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python监控键盘输入实例代码
2018/02/09 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
Python多图片合并PDF的方法
2019/01/03 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
工作说明书格式
2014/07/29 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
JS setTimeout与setInterval的区别
2022/04/20 Javascript