Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在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

复制
相关文章
在现代 JavaScript 中编写异步任务[每日前端夜话0xDD]
在本文中,我们将探讨过去异步执行的 JavaScript 的演变,以及它是怎样改变我们编写代码的方式的。我们将从最早的 Web 开发开始,一直到现代异步模式。
疯狂的技术宅
2019/11/03
2.5K0
Flask中简单实现异步任务,非常实用的小技巧
众所周知Flask默认不能很好的完成异步任务,那么我们如何在请求中快速返回状态并异步执行比较复杂耗时的任务呢?
bdcn
2020/01/14
3.6K0
Python 异步: 创建和运行异步任务(7)
您可以从 asyncio 程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成为事件循环中的任务并作为任务进行管理。
数据科学工厂
2023/02/06
1.9K0
Python 异步: 创建和运行异步任务(7)
您可以从 asyncio 程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成为事件循环中的任务并作为任务进行管理。
数据科学工厂
2023/02/27
8190
Python 异步: 创建和运行异步任务(7)
异步任务队列Celery在Django中的应用
关于Django的介绍,之前在2018年9月17号的文章中已经讲过了,大家有兴趣可以翻翻之前的文章,这里再简单介绍下:
AsiaYe
2019/11/06
3.3K0
异步任务队列Celery在Django中的应用
Flask 学习-86.Flask-APScheduler 创建定时任务
Flask-APScheduler是根据APScheduler编写的一个flask模块,它提供了API管理任务。
上海-悠悠
2023/01/03
2.2K0
python使用Flask,Redis和Celery的异步任务
随着Web应用程序的发展和使用的增加,用例也变得多样化。我们现在正在建设和使用网站来执行比以往任何时候都更复杂的任务。其中一些任务可以进行处理,并将反馈立即转发给用户,而其他任务则需要稍后进行进一步处理和结果转发。越来越多地采用Internet访问和支持Internet的设备导致最终用户流量增加。
拓端
2020/12/31
1.3K0
python使用Flask,Redis和Celery的异步任务
随着Web应用程序的发展和使用的增加,用例也变得多样化。我们现在正在建设和使用网站来执行比以往任何时候都更复杂的任务。其中一些任务可以进行处理,并将反馈立即转发给用户,而其他任务则需要稍后进行进一步处理和结果转发。越来越多地采用Internet访问和支持Internet的设备导致最终用户流量增加。
拓端
2020/09/26
2.1K0
在springboot工程中创建定时任务,使用quartz
使用springboot自带的schedule实现定时任务,不用引用任何第三方的工具包,只需要:
JQ实验室
2022/11/26
3.2K0
如何取消 JavaScript 中的异步任务
有时候执行异步任务可能是很困难的,尤其是在特定的编程语言不允许取消被错误启动或不再需要的操作时。幸运的是 JavaScript 提供了非常方便的功能来中止异步活动。在本文中,你可以学到如何创建可中止的函数。
疯狂的技术宅
2020/03/26
3.5K0
如何取消 JavaScript 中的异步任务
springBoot异步任务、异步监控
除了自己实现线程外,springBoot本身就提供了通过注解的方式,进行异步任务的执行。下面主要记录一下,在springBoot项目中实现异步任务,以及对异步任务进行封装监控。
xcbeyond
2020/04/02
1.3K0
springboot任务之异步任务
此时我们启动服务器,并输出localhost:8080/hello,会在3s之后响应的success。
西西嘛呦
2020/08/26
4680
在C#中使用 CancellationToken 处理异步任务
在 .NET Core 中使用异步编程已经很普遍了, 你在项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了CancellationToken参数,本文主要介绍下 CancellationTokenSource 和 CancellationToken在异步任务中的使用。
全球技术精选
2021/03/23
2K0
在C#中使用 CancellationToken 处理异步任务
SpringBoot异步任务
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。
别团等shy哥发育
2023/02/25
3840
SpringBoot异步任务
Linux中创建定时任务
在Linux上创建定时任务可以使用 crontab,我的机器是自带的,安装应该也不会很麻烦,具体的百度一下了。
渔父歌
2019/07/25
2.7K0
Android异步任务
Android 异步任务队列实现AsynTask异步任务源代码解析 android异步任务 访问网络 加载图片 解决方案大集合 Android异步消息处理机制的源码分析 AsyncTask异步从网上下载图片 线程基本概念及编程 给 Android 开发者的 RxJava 详解 Android多线程编程的总结    ***************** 关于android中postDelayed方法的讲解 - 如是观的专栏 - 博客频道 - CSDN.NET 详细介绍AIDL 的使用 -
用户1733354
2018/05/22
7640
.Net中异步任务的取消和监控
OperationCanceledException 令牌被取消时抛出的异常,可以由监听者自主决定是否抛出异常
蓝夏
2021/09/09
8420
异步任务中的重新进入(Reentrancy)
2017-12-05 14:10
walterlv
2018/09/18
6610
Flask-在Flask中跨请求传递数据资源
利用 Flask的底层Werkzeug是有缓存支持的,不用使用redis等第三方。
用户1558882
2018/10/25
1.3K0
点击加载更多

相似问题

使用R生成泊松过程

23

用可变速率拟合带上限泊松过程

11

在R中模拟泊松过程

116

泊松过程试验

36

R泊松模拟

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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