当前位置: 首页 > news >正文

Flask实现异步调用sqlalchemy的模型类

事情是这样的,我这边需要在一次请求里面,搞一个异步不阻碍的任务,来执行耗时的操作。
一开始,我准备写的代码是这样的:

from flask import Flask
import time
from concurrent.futures import ThreadPoolExecutorexecutor = ThreadPoolExecutor(1)app = Flask(__name__)@app.route('/synchronize')
def update_redis():executor.submit(do_update)return 'ok'def do_update():time.sleep(3)print('start update')if __name__ == '__main__':app.run()

但是,异步函数里面没有app的上下文,没办法调用sqlalchemy模型类、config内容、logger等。
所以,我封装成了一个接口,异步只负责发起耗时请求,这样就可以在耗时请求TtsCopyVoiceRaw里面正常使用app上下文了:

# 复制音色 异步
class TtsCopyVoiceRaw(Resource):def post(self):user_id = request.json.get('user_id')name = request.json.get('name')speed = request.json.get('speed', 0.75)audio_url = request.json.get('audio_url')current_app.logger.info('copy_voice 1 --------------')current_app.logger.info(user_id, name, audio_url, speed)try:voice_id = TTSApi().copy_voice(user_id, name, audio_url, speed)audition_url = TTSApi().tts(user_id, '欢迎使用直播助手,我是{}'.format(name), voice_id, speed)current_app.logger.info('copy_voice voice_id --------------')current_app.logger.info(voice_id)voice_obj = db.session.query(UserTimbre).filter(UserTimbre.user_id == user_id,UserTimbre.name == name,).first()voice_obj.voice_id = voice_idvoice_obj.audition_url = audition_urlvoice_obj.status = 3db.session.commit()except Exception as e:current_app.logger.info('copy_voice failed --------------')current_app.logger.info(traceback.format_exc())voice_obj = db.session.query(UserTimbre).filter(UserTimbre.user_id == user_id,UserTimbre.name == name,).first()voice_obj.status = 4db.session.commit()def copy_voice(full_path, user_id, name, audio_url, speed):print('copy_voice -----------')print(full_path, user_id, name, audio_url, speed)requests.post(full_path + '/raw', json=dict(user_id=user_id,name=name,audio_url=audio_url,speed=speed,))# 复制音色
class TtsCopyVoice(ResourceApiPassed):def post(self):user_id = self.user_info.get('id')name = request.json.get('name')speed = request.json.get('speed', 0.75)audio_url = request.json.get('audio_url')total = db.session.query(UserTimbre).filter(UserTimbre.user_id == user_id,UserTimbre.name == name,).count()if total:raise APIException('名称已存在,请改名重新创建')current_app.logger.warn('TtsCopyVoice ******* 1')current_app.logger.warn(user_id)current_app.logger.warn(name)current_app.logger.warn(speed)current_app.logger.warn(audio_url)try:current_app.logger.warn('obj ------------- 0')# 创建 用户音色obj = UserTimbre(user_id = user_id,name = name,status = 1,)db.session.add(obj)db.session.commit()except Exception as e:current_app.logger.warn('e ------------- 0')current_app.logger.warn(e)current_app.logger.warn('e ------------- 1')current_app.logger.warn(traceback.format_exc())raise APIException('创建失败')current_app.executor.submit(copy_voice, request.url, user_id, name, audio_url, speed)return success({'id': obj.id})
http://www.lryc.cn/news/295306.html

相关文章:

  • Pocket2Mol + Generation of Atom Positions生成原子位置的方法有什么?联合概率是什么?
  • 区分手机小程序以及电脑小程序;左滑、导航键返回拦截
  • Web APIs 2 事件
  • 网易腾讯面试题精选----90道设计模式面试题及答案
  • 程序员的数字化工作台:理解不关机背后的逻辑与需求
  • Java Socket Server TCP服务端向指定客户端发送消息
  • java日志框架总结(五、logback日志框架)
  • android下library打包aar并上传到maven,嵌入版的app
  • Xampp中Xdebug的安装使用
  • 金融行业的软件测试分析
  • 踩坑了,MySQL数据库生成大量奇怪的大文件
  • ctfshow-web11~20-WP
  • 2.5学习总结9
  • 删除.git的影响、git分支切换时注意事项
  • Linux系统调试课:硬件断点
  • 百卓Smart管理平台 uploadfile.php 文件上传漏洞复现(CVE-2024-0939)
  • 关于RabbitMQ常见的十道面试题
  • spring cloud stream
  • vue3 之 组合式API—watch函数
  • 并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】
  • EmoLLM-心理健康大模型
  • 学成在线:采用XXL-JOB任务调度方案使用FFmpeg处理视频转码业务
  • 计算机毕业设计 | SpringBoot大型旅游网站 旅行后台管理系统(附源码)
  • 蓝桥杯----凑算式
  • JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模
  • 执行 terraform init 命令时 timeout 的解决方法
  • Docker Arthas 实战指南
  • freertos 源码分析四 任务创建的简单分析
  • 二叉树的锯齿形遍历,力扣
  • 避免Arrays.asList陷阱:优雅处理结构性修改的方法