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 相关文章推荐
简介Django中内置的一些中间件
Jul 24 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
python 列表推导式使用详解
Aug 29 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
完美解决jupyter由于无法import新包的问题
May 26 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
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
php接口技术实例详解
2016/12/07 PHP
php创建类并调用的实例方法
2019/09/25 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
javascript常用函数(2)
2015/11/05 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
Python和Sublime整合过程图示
2019/12/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
酒店前厅员工辞职信
2014/01/08 职场文书
公司面试感谢信
2014/02/01 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
总结Python变量的相关知识
2021/06/28 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python