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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
Pandas 缺失数据处理的实现
Nov 04 Python
Python中的四种交换数值的方法解析
Nov 18 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Python3的socket使用方法详解
Feb 18 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
python实现给数组按片赋值的方法
2015/07/28 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
用Python解数独的方法示例
2019/10/24 Python
python实现按首字母分类查找功能
2019/10/31 Python
基于python实现地址和经纬度转换
2020/05/19 Python
python连接mysql有哪些方法
2020/06/24 Python
Pycharm安装python库的方法
2020/11/24 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
简约控的天堂:The Undone
2016/12/21 全球购物
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
自我评价的写作规则
2014/01/06 职场文书
教师产假请假条
2014/04/10 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
JavaScript 定时器详情
2021/11/11 Javascript