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 Web开发框架Django
Jun 30 Python
跟老齐学Python之编写类之二方法
Oct 11 Python
python logging类库使用例子
Nov 22 Python
python批量生成本地ip地址的方法
Mar 23 Python
python计算牛顿迭代多项式实例分析
May 07 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
python实现音乐下载器
Apr 15 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
用基于python的appium爬取b站直播消费记录
Apr 17 Python
Python中的xlrd模块使用整理
Jun 15 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
克隆一个新项目的快捷方式
2013/04/10 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
Prototype Date对象 学习
2009/07/12 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
Python内置函数的用法实例教程
2014/09/08 Python
python实现图片变亮或者变暗的方法
2015/06/01 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
《秋姑娘的信》教学反思
2014/02/28 职场文书
计划生育个人总结
2015/03/02 职场文书
简历自我评价优缺点
2015/03/11 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
Python基础 括号()[]{}的详解
2021/11/07 Python