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实现的使用telnet登陆聊天室实例
Jun 17 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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 UTF8 文件的签名问题
2009/10/30 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
javascript arguments使用示例
2014/12/16 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
如何从零开始手写Koa2框架
2019/03/22 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
医科大学生的自我评价
2013/12/04 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
协议书范文
2015/01/27 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫