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 相关文章推荐
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
python机器学习之神经网络实现
Oct 13 Python
python实现定时发送qq消息
Jan 18 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
关于Python使用turtle库画任意图的问题
Apr 01 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
Symfony的安装和配置方法
2016/03/17 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
js实现随机点名程序
2020/09/17 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
python3大文件解压和基本操作
2017/12/15 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
python中的协程深入理解
2019/06/10 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
测试工程师岗位职责
2013/11/28 职场文书
物业门卫岗位职责
2013/12/28 职场文书
先进个人事迹材料
2014/01/25 职场文书
经济担保书范文
2014/04/02 职场文书
出生证明公证书
2014/04/09 职场文书
2014年预算员工作总结
2014/12/05 职场文书
冰峪沟导游词
2015/02/09 职场文书
政协委员个人总结
2015/03/03 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript