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转换HTML到Text纯文本的方法
Jan 15 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python中的集合类型知识讲解
Aug 19 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
numpy中矩阵合并的实例
Jun 15 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
vscode+PyQt5安装详解步骤
Aug 12 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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借助phpmailer发送邮件
2015/05/11 PHP
PHP6新特性分析
2016/03/03 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
php实现小程序支付完整版
2018/10/09 PHP
html读出文本文件内容
2007/01/22 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
Javascript实现字数统计
2015/07/03 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
Python及PyCharm下载与安装教程
2017/11/18 Python
python 列表推导式使用详解
2019/08/29 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
Python 如何创建一个线程池
2020/07/28 Python
Django xadmin安装及使用详解
2020/10/26 Python
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
《美丽的小路》教学反思
2014/02/26 职场文书
大家访活动实施方案
2014/03/10 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server