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创建xml文件示例
Mar 22 Python
聊聊Python中的pypy
Jan 12 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
详解Python中的分组函数groupby和itertools)
Jul 11 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
Python 列表的清空方式
Jan 13 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 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微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
社区志愿者心得体会
2014/01/03 职场文书
关于美容院的活动方案
2014/08/14 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
给领导的感谢信范文
2015/01/23 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
python如何做代码性能分析
2021/04/26 Python
vue引入Excel表格插件的方法
2021/04/28 Vue.js
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电