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中测试访问同一数据的竞争条件的方法
Apr 23 Python
Django 生成登陆验证码代码分享
Dec 12 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
Python实现word2Vec model过程解析
Dec 16 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
详解python tkinter模块安装过程
Jan 06 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
python实现画图工具
Aug 27 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
javascript工具库代码
2012/03/29 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Python lxml模块安装教程
2015/06/02 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
python开发前景如何
2020/06/11 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
2014年个人思想工作总结
2014/11/27 职场文书
质量保证书格式
2015/02/27 职场文书
药品开票员岗位职责
2015/04/15 职场文书
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android