Python自定义主从分布式架构实例分析


Posted in Python onSeptember 19, 2016

本文实例讲述了Python自定义主从分布式架构。分享给大家供大家参考,具体如下:

环境:Win7 x64,Python 2.7,APScheduler 2.1.2。

原理图如下:

Python自定义主从分布式架构实例分析

代码部分:

(1)、中心节点:

#encoding=utf-8
#author: walker
#date: 2014-12-03
#function: 中心节点(主要功能是分配任务)
import SocketServer, socket, Queue
CenterIP = '127.0.0.1'  #中心节点IP
CenterListenPort = 9999  #中心节点监听端口
CenterClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #中心节点用于发送网络消息的socket
TaskQueue = Queue.Queue() #任务队列
#获取任务队列
def GetTaskQueue():
  for i in range(1, 11):
    TaskQueue.put(str(i))
#CenterServer的回调函数,在接受到udp报文是触发
class MyUDPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    data = self.request[0].strip()
    socket = self.request[1]
    print(data)
    if data.startswith('wait'):
      vec = data.split(':')
      if len(vec) != 3:
        print('Error: len(vec) != 3')
      else:
        nodeIP = vec[1]
        nodeListenPort = vec[2]
        nodeID = nodeIP + ':' + nodeListenPort
        if not TaskQueue.empty():
          task = TaskQueue.get()
          print('send task ' + task + ' to ' + nodeID)
          CenterClient.sendto('task:' + task, (nodeIP, int(nodeListenPort)))
        else:
          print('TaskQueue is empty!')
GetTaskQueue() #获取任务队列
CenterServer = SocketServer.UDPServer((CenterIP, CenterListenPort), MyUDPHandler)
print('Listen port ' + str(CenterListenPort) + ' ...')
CenterServer.serve_forever()

(2)、任务节点:

#encoding=utf-8
#author: walker
#date: 2014-12-03
#function: 任务节点(请求/接收/执行任务)
import time, socket, SocketServer
from apscheduler.scheduler import Scheduler
CenterIP = '127.0.0.1'  #中心节点IP
CenterListenPort = 9999  #中心节点监听端口
NodeIP = socket.gethostbyname(socket.gethostname())  #任务节点自身IP
NodeClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  #任务节点用于发送网络消息的socket
#任务:发送网络信息
def jobSendNetMsg():
  msg = ''
  if NodeServer.TaskState == 'wait':
    msg = 'wait:' + NodeIP + ':' + str(NodeListenPort)
  elif NodeServer.TaskState == 'exec':
    msg = 'exec:' + NodeIP + ':' + str(NodeListenPort)
  print(msg)
  NodeClient.sendto(msg, (CenterIP, CenterListenPort))
#添加并启动定时任务
def InitTimer():
  sched = Scheduler()
  sched.add_interval_job(jobSendNetMsg, seconds=1)
  sched.start()
#执行任务
def ExecTask(task):
  print('ExecTask ' + task + ' ...')
  time.sleep(2)
  print('ExecTask ' + task + ' over')
#NodeServer的回调函数,在接受到udp报文是触发
class MyUDPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    data = self.request[0].strip()
    socket = self.request[1]
    print('recv data: ' + data)
    if data.startswith('task'):
      vec = data.split(':')
      if len(vec) != 2:
        print('Error: len(vec) != 2')
      else:
        task = vec[1]
        self.server.TaskState = 'exec'
        ExecTask(task)
        self.server.TaskState = 'wait'
InitTimer()
NodeServer = SocketServer.UDPServer(('', 0), MyUDPHandler)
NodeServer.TaskState = 'wait' #(exec/wait)
NodeListenPort = NodeServer.server_address[1]
print('NodeListenPort:' + str(NodeListenPort))
NodeServer.serve_forever()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python深入学习之内存管理
Aug 31 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
python反爬虫方法的优缺点分析
Nov 25 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
Python实现网络端口转发和重定向的方法
Sep 19 #Python
Python中__init__.py文件的作用详解
Sep 18 #Python
Python简单遍历字典及删除元素的方法
Sep 18 #Python
Python实现压缩与解压gzip大文件的方法
Sep 18 #Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 #Python
Python简单格式化时间的方法【strftime函数】
Sep 18 #Python
Python简单获取自身外网IP的方法
Sep 18 #Python
You might like
php生成WAP页面
2006/10/09 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
python操作sqlite的CRUD实例分析
2015/05/08 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
python str字符串转uuid实例
2020/03/03 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
python为什么要安装到c盘
2020/07/20 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
EJB发布WEB服务一般步骤
2012/10/31 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
外国语学院毕业生自荐信
2013/10/28 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
公证委托书模板
2014/04/03 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
个人工作年终总结
2015/03/09 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS