利用tornado异步执行脚本

news/2023/6/7 23:38:07

背景

最近我们有个需求,需要去同步上游数据,并进行数据同步,数据清洗,数据整合,数据推送的功能;要求在接收到上游客户端的请求,才执行该操作;我们这里分享该功能实现,包括踩的一些坑(异步操作时sqoop推数失败的情况);

需求分析

需求介绍: 接收到请求之后,执行一系列的脚本,实现数据同步,数据整合,数据推送的功能,并及时告知下游系统,让下游系统做后续的操作;

方案设计
框架选型:Python的tornado框架,版本5.1
实现逻辑:采用tornado的异步架构,做成web,分为两个接口,这里简称接口1和接口2;
接口1主要是接收第一次请求,接收到请求后,直接和请求端断掉连接(使用tornado的self.finish函数可实现),并异步执行数据同步,数据清洗,数据整合,数据推送的功能;
接口2主要是告知请求端当前接口1的执行状态;

代码实现

#coding:utf8from tornado.web import RequestHandler
from util import commonutil
import logging
import json
import configparser
from pyhive import hive
from elasticsearch import Elasticsearch
import requests
import time
import tornado.gen
import subprocess
from tornado.process import Subprocess
import tornado.gen@tornado.gen.coroutine
def run_command(command):''':param cmd::return:'''process = Subprocess([command],stdout=Subprocess.STREAM,stderr=Subprocess.STREAM,shell=True)out, err = yield [process.stdout.read_until_close(),process.stderr.read_until_close()]raise tornado.gen.Return((out,err))class Class1(RequestHandler):async def post(self, *args, **kwargs):jd = self.request.body.decode("utf-8")jsonData = json.loads(jd)loggers.info("==数据同步整合重跑==")self.set_header('Content-Type','application/json;charset=UTF-8')result = {}try:mysql_conn = commonutil.connect_mysql(auto_ip,auto_port,auto_db,auto_user,auto_passwd)cursor = mysql_conn.cursor()	result['status'] = 0result['msg'] = '参数检查正常,正在进行理财重跑'self.finish(json.dumps(result))os.chdir("需要执行的脚本目录")print("executing-------------")cmd = 'python3 script.py {} {} {}'.format(mainDir,data_dt,prdnbrs)print(cmd)r_cmd_res,r_cmd_err = await run_command(cmd)os.chdir(mainDir)except Exception as ex:os.chdir(mainDir)loggers.info(ex)raise exdef get(self,*args,**kwargs):pass

注:1.这里只是提供了class类,需要使用时在main.py中注册即可;
2.采用self.finish的方法,可以和请求端断掉连接,并可以进行后续的操作;
3.script.py是一个封装的代码,里面包含了数据同步,数据整合,数据导出等所有的功能,其中数据同步和数据导出是采用sqoop进行处理的;
4.我们在生产上部署过程中,遇到了一个特别坑的问题,这种问题并不是每次都会出现,因此找了好久才发现这个问题,问题的大致情况是执行到数据同步时就会出现程序阻塞的情况,一致卡在那,自己执行不了,还会影响其他的程序执行;经过多测测试,我们发现是nohup的问题;
大家可以参考如下的的文章:https://blog.csdn.net/haha_keke/article/details/122218675
我们在linux服务器上部署tornado服务的时候,是采用

nohup python3 main.py &

的方式进行部署的,这种方式在执行过程中会出现阻塞,尤其是sqoop抽数这种和外部有交互的情况;

总结

采用tornado异步的方式部署一个web服务,用于接收客户端的请求,并执行python脚本;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4562926.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

python异步协程爬取百度小说之西游记

爬虫百度小说之西游记 参考文章链接:https://blog.csdn.net/weixin_45788900/article/details/119539952 一、百度小说之西游记网址:小说网址 二、爬取源代码: # -*- coding utf-8 -*- # Time : 2021/9/1 10:55 # Software : PyCharm # …

JS数组、对象、字符串常用方法汇总

JS数组、对象、字符串常用方法汇总前言数组常用方法Array.prototype.slice(start, end)Array.prototype.map()Array.prototype.forEach()Array.prototype.filter()Array.prototype.every()Array.prototype.some()Array.prototype.reduce()Array.prototype.push()Array.prototyp…

【手游】少年西游记 美术资源加密分析

有个网友让我帮忙分析下《少年西游记》这款手游,分析过程和大家分享一下 0x00 先用WinHex看看少年西游记资源包package.was 粗略的分析可以把PackageWas的结构看成为这样: ┌─PackageWas ┊ ├─文件头 ┊ ├─文件1 ┊ ├─ …

【Java基础】Java字符串的处理

目录 一、Java定义字符串 1.直接定义字符串 2.用构造函数创建字符串: 二、Java连接字符串 1.使用连接运算符 2.使用 concat() 方法 3.连接其他类型数据 三、Java获取字符串长度(length()) 四、Java转换大小写(toLowerCase()和toUp…

Neo4j 之西游记取经团队人物创建和关系设置

以西游记小说为为例子 创建 创建带属性的人物节点 创建取经团队的人物,包含名称和年龄属性 CREATE (xyj_tsz:X_Person{name:"唐三藏",age:39}) CREATE (xyj_swk:X_Person{name:"孙悟空",age:520}) CREATE (xyj_zbj:X_Person{name:"猪八…

RTMP协议封装H264和H265协议详解

RTMP协议封装H264和H265协议详解 文章目录RTMP协议封装H264和H265协议详解1 RTMP和FLV2 RTMP协议封装H264视频流2.1 RTMP发送AVC sequence header2.2 RTMP发送AVCC视频帧数据‘3 RTMP协议封装H265视频流1 RTMP和FLV 有关RTMP和FLV格式详细介绍可查看如下文章: http…

纵论现实中的软件工程

纵论现实中的软件工程 NetReptile推荐 [2006-5-16]出处:UMLO软件工程组织作者:不详1.大公司手中的算盘  从最早仅仅关注于软件开发工具到现在,软件行业中的巨头们已经在层出不穷的思想中涅槃了一回又一回。  Rational被IBM并购的真实原因…

(转载)现实中的软件工程

2006年04月13日 17:52:00 "王不如远交而近攻,得寸,则王之寸;得尺,亦王之尺也。"--《战国策 秦策》1.大公司手中的算盘 从最早仅仅关注于软件开发工具到现在,软件行业中的巨头们已经在层出不穷的思想中涅槃了…