Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Flask中创建异步任务

在Flask中创建异步任务
EN

Stack Overflow用户
提问于 2015-08-06 22:24:45
回答 4查看 133.4K关注 0票数 128

我正在用Flask编写一个应用程序,除了WSGI是同步的和阻塞的之外,它工作得非常好。我有一个特别的任务,它调用第三方API,该任务可能需要几分钟才能完成。我想进行这个调用(实际上是一系列调用),并让它运行。同时将控制权返回给Flask。

我的观点如下所示:

代码语言:javascript
运行
AI代码解释
复制
@app.route('/render/<id>', methods=['POST'])
def render_script(id=None):
    ...
    data = json.loads(request.data)
    text_list = data.get('text_list')
    final_file = audio_class.render_audio(data=text_list)
    # do stuff
    return Response(
        mimetype='application/json',
        status=200
    )

现在,我想要做的就是把这句话

代码语言:javascript
运行
AI代码解释
复制
final_file = audio_class.render_audio()

运行并提供方法返回时要执行的回调,同时Flask可以继续处理请求。这是我唯一需要Flask异步运行的任务,我想要一些关于如何最好地实现它的建议。

我看过Twisted和Klein,但我不确定它们是否过度杀伤力,因为也许线程就足够了。或许芹菜是个不错的选择?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-06 22:56:05

我将使用Celery为您处理异步任务。您需要安装一个代理来作为您的任务队列(推荐使用RabbitMQ和Redis )。

app.py

代码语言:javascript
运行
AI代码解释
复制
from flask import Flask
from celery import Celery

broker_url = 'amqp://guest@localhost'          # Broker URL for RabbitMQ task queue

app = Flask(__name__)    
celery = Celery(app.name, broker=broker_url)
celery.config_from_object('celeryconfig')      # Your celery configurations in a celeryconfig.py

@celery.task(bind=True)
def some_long_task(self, x, y):
    # Do some long task
    ...

@app.route('/render/<id>', methods=['POST'])
def render_script(id=None):
    ...
    data = json.loads(request.data)
    text_list = data.get('text_list')
    final_file = audio_class.render_audio(data=text_list)
    some_long_task.delay(x, y)                 # Call your async task and pass whatever necessary variables
    return Response(
        mimetype='application/json',
        status=200
    )

运行您的Flask应用程序,并启动另一个进程来运行您的芹菜工人。

代码语言:javascript
运行
AI代码解释
复制
$ celery worker -A app.celery --loglevel=debug

我还会参考Miguel Gringberg的write up,以获得更深入的指南,了解如何在Flask中使用芹菜。

票数 119
EN

Stack Overflow用户

发布于 2020-03-27 15:50:19

您还可以尝试在daemon=True中使用multiprocessing.Processprocess.start()方法不会阻塞,您可以在代价高昂的函数在后台执行时立即向调用者返回响应/状态。

在使用falcon框架和使用daemon process时,我遇到了类似的问题。

您需要执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
from multiprocessing import Process

@app.route('/render/<id>', methods=['POST'])
def render_script(id=None):
    ...
    heavy_process = Process(  # Create a daemonic process with heavy "my_func"
        target=my_func,
        daemon=True
    )
    heavy_process.start()
    return Response(
        mimetype='application/json',
        status=200
    )

# Define some heavy function
def my_func():
    time.sleep(10)
    print("Process finished")

您应该会立即得到响应,10秒后,您应该会在控制台中看到打印的消息。

注意:请记住,daemonic进程不允许派生任何子进程。

票数 29
EN

Stack Overflow用户

发布于 2021-06-05 16:37:55

烧瓶2.0

Flask 2.0现在支持异步路由。为此,您可以使用httpx库和asyncio协程。你可以像下面这样修改你的代码

代码语言:javascript
运行
AI代码解释
复制
@app.route('/render/<id>', methods=['POST'])
async def render_script(id=None):
    ...
    data = json.loads(request.data)
    text_list = data.get('text_list')
    final_file =  await asyncio.gather(
        audio_class.render_audio(data=text_list),
        do_other_stuff_function()
    )
    # Just make sure that the coroutine should not  having any blocking calls inside it. 
    return Response(
        mimetype='application/json',
        status=200
    )

上面的代码只是一个伪代码,但是你可以检查asyncio是如何与flask 2.0一起工作的,对于HTTP调用,你可以使用httpx。还要确保协程只执行一些I/O任务。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31866796

复制
相关文章
开发需求
计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 import re import functools def minus_operator_handler(formula): '''处理一
hankleo
2020/09/16
3790
腾讯云什么产品可以满足大型语言模型的开发需求?
腾讯云提供了多种产品和服务,可以满足大型语言模型的开发需求,以下是一些常用的产品和服务:
gavin1024
2023/05/18
9230
上亿商品的语言处理需求 | 京东AI NLP技术的研究与落地
从2010年起,深度神经网络开始在各个领域引发人工智能技术的重大突破。在语音识别领域,截止到2017年,借助于深度学习技术语音识别在Switchboard数据集上的词错误率下降到5.1%,基本可与人工识别相媲美;而在图像识别领域、机器翻译、语音合成技术等其他领域也取得了巨大进步,使得机器基本已经做到和人一样能听、能看、能说。随着人工智能技术这些领域的不断突破,人们也更期待看到自然语言处理技术(NLP)带来更多的创新。
京东技术
2018/07/30
1.1K0
上亿商品的语言处理需求 | 京东AI NLP技术的研究与落地
你给需求文档,AI就能帮你开发安卓App
就有一个叫做Text2App的“AI”,你“喂”给它一串文字需求,它就能直接给你“消化”成安卓应用!
量子位
2021/06/17
1.1K0
用于AI开发的5种最佳编程语言
你是一个对你下一个项目选择编程语言困惑的AI(人工智能)追求者吗?如果是这样,那么你来对地方了,因为在这里我们将看到AI开发最好的5种编程语言。
老人雨何
2018/01/29
3.4K0
2022 需求最大的 8 种编程语言
DevJobsScanner 在过去的 14 个月(从 2021 年 10 月到 2022 年 11 月)中分析了超过 1200 万个开发人员职位需求,并从其中挑选了明确需要编程语言的工作机会,得到了 2022 年最受欢迎的 8 种编程语言。
小林coding
2023/01/04
8830
2022 需求最大的 8 种编程语言
没有需求文档,拒绝开发?
在我们公司,需求都是开发口头去问产品,就直接开发了。产品不给写需求文档,开发和测试同学应该接受吗 ?
程序媛淼淼
2022/09/01
1K0
最适合AI开发的六种编程语言
AiTechYun 编辑:nanan 自从AlphaGo战胜柯洁,AI风头就一直无人能及。而对于开发者来说,AI是一个十分广阔的领域,很多编程语言都可以利用AI进行开发。下面是整理出的几种典型编程语言供大家参考: Python Python是AI领域中使用最广泛的编程语言之一,它简单易用,且可以无缝与数据结构和其他常用的AI算法一起使用。基于Python的很多有用的库都可以在AI中使用,例如Numpy提供科学的计算能力,Scypy的高级计算和Pybrain的机器学习。 Java Java也是AI项目的一
企鹅号小编
2018/01/19
1.7K0
最适合AI开发的六种编程语言
社交直播APP源码开发搭建的多种业态需求和功能需求
所谓的“一对多社交”,比如直播社交,这就是典型的一对多社交,一位主播对多位观众,通过弹幕和评论进行互动,如果有聊得开心的(打赏多的)可以再聊个私信什么的。
布谷鸟小刘
2021/07/23
6690
关于软件开发需求分析的分享
  软件需求分析就是把软件计划期间建立的软件可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素。需求分析是软件定义阶段中的最后一步,是确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。
用户7053485
2020/03/12
1.5K0
【盘点】最适合AI开发的六种编程语言
自从AlphaGo战胜柯洁,AI风头就一直无人能及。而对于开发者来说,AI是一个十分广阔的领域,很多编程语言都可以利用AI进行开发。下面是整理出的几种典型编程语言供大家参考: Python Pytho
AiTechYun
2018/03/06
1.4K0
【盘点】最适合AI开发的六种编程语言
软件工程:需求开发阶段
需求开发阶段的主要任务就是分析问题,研究问题所发生的现实世界(即问题域),寻找实现软件系统与现实世界有效互动的办法,并严格描述该互动办法。而软件需求开发是一个连接现实世界与计算机世界的活动,是软件工程的起始阶段,设计、实现等后续阶段的正确性都以它的正确性为前提。如果需求开发过程中有错误未能解决,则其后的所有阶段都会受到影响,因此与需求有关的错误修复代价较高,需求问题对软件成败的影响较大。而我们之所以认识不到需求开发阶段的重要性主要是因为学校时间项目的特殊性,具体来说学校的课程设计或实训:
Here_SDUT
2022/09/19
2.2K0
软件工程:需求开发阶段
小智ai:chatgpt带来哪些新岗位的需求
ChatGPT作为一项重要的自然语言处理技术,已经在各个领域中产生了广泛的应用。这些应用也带来了新的就业机会和需求,以下是一些可能的新岗位:
用户10544499
2023/05/05
2560
为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?
人工智能(AI)作为一项颠覆性的技术,正日益在各个领域展现出巨大的潜力和影响力。在AI开发中选择适合的编程语言至关重要。本文将探讨为什么Python成为开发AI的主流语言,同时分析Java系列和Ruby在这个领域的局限性。
海拥
2023/06/27
4080
为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?
在线教育平台开发需求分析
随着互联网的不断发展,现代信息技术向教育行业迅速扩展,教育的方式也不再是传统面对面的书本传授了,线下模式正面临着前所未有的严峻挑战,同时也面临着前良好的发展机遇—在线教育平台开发需求旺盛。它打破了传统教育的局限,在高等教育、继续教育、在职教育乃至终身教育中发挥前所未有的作用。
万岳教育系统
2020/06/04
3.6K0
在线教育平台开发需求分析
基于契约的开发:通过明确需求优化软件开发流程
作者 | Naresh Jain 译者 | 明知山 策划 | 丁晓昀 独立开发和部署单个微服务的能力是成功采用微服务策略最关键的指标。然而,大多数团队在部署微服务之前必须经历大量的集成测试。这是因为集成测试已经成为识别微服务之间兼容性问题的必要条件,因为单元和组件或 API 测试没有覆盖微服务之间的交互。 首先,集成测试是一种发现兼容性问题的后期反馈机制。修复这些问题的成本随着发现时间的推移而成倍增加(如上图底部的热图所示)。 此外,这可能会导致客户端和服务端团队做大量的返工工作,严重影响特性交
深度学习与Python
2023/03/29
7850
基于契约的开发:通过明确需求优化软件开发流程
那些需要自己开发的安全需求(服务端)
最近在实施App安全方面的方案,下面是一些思考。有些安全方面的产品需要购买,本文中的却要自己集成。需要开发的组件很多,所以依个人经验,简单做了下分层,不包括App端和主机环境。
xjjdog
2019/07/10
5870
那些需要自己开发的安全需求(服务端)
SaaS企业要满足客户的定制开发需求吗?
本文作者 吴昊:腾讯SaaS加速器导师、纷享销客天使投资人、前执行总裁,具有20年企业信息化和6年SaaS营销团队创新经验。 前天和一个做SaaS的团队交流,他们处在我说的《SaaS创业路线图》中的“产品打磨”阶段 —— 产品已经做出来,也找到了少量试用客户。 这时候遇到一个大家常见的问题:目标客户提出的需求超越了我们初定的需求边界,要不要做定制开发?这个问题,不少创业公司都会遇到。每家都有难念的经,具体情况各不相同,今天我为大家写几条原则吧。 第一,明确自己是做产品的,还是做项目的。做项目的公司
腾讯SaaS加速器
2020/06/09
1.2K0
干货分享:五大最适合学习AI开发的编程语言
AI(人工智能)为应用开发者开创了一个全新的可能性。通过利用机器学习或深度学习,您可以生成更好的用户配置文件、个性化设置和推荐,或者整合更智能的搜索、语音界面或智能助手,或者以其他数种方式改进您的应用。你甚至可以构建看得懂、听得懂,并与人类互动的应用。准备学习AI的你,知不知道选择哪种编程语言合适呢?以下列举的五种编程语言,被认为是最适合用来学习AI。大家可以参考一下。
LiveEdu
2018/05/21
1.7K0
干货分享:五大最适合学习AI开发的编程语言
产品需求与项目需求的差异
产品周期要比项目周期长久,项目周期随着交付就结束了,后期或许会有维护阶段。产品则贯穿了整个产品的生命周期,从一个idea到落地,经过市场检验,中间也可能发生方向性调整等等,一直到产品退出市场,这个周期可能跟项目周期一样,也可能是拉长了的几个项目周期。
MavenTalker
2023/03/07
8140
产品需求与项目需求的差异

相似问题

Setuptools“开发”需求

127

如何开发AI脚本

31

iPhone开发的系统需求

33

iOS开发测试需求

14

CKAN扩展开发需求

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档