当前位置: 首页 > 面试题库 >

在Flask中进行异步任务

麻桐
2023-03-14
问题内容

我正在Flask中编写一个应用程序,除了WSGI同步和阻塞之外,它的运行情况非常好。我特别有一项任务,该任务调出第三方API,该任务可能需要几分钟才能完成。我想拨打该电话(实际上是一系列电话)并使其运行。同时控制权返回给Flask。

我的看法如下:

@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
    )

现在,我要做的就是

final_file = audio_class.render_audio()

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

我看过Twisted和Klein,但我不确定它们是否过大,因为Threading就足够了。或者也许celery是一个不错的选择?


问题答案:

我将使用Celery为你处理异步任务。你需要安装代理以充当任务队列(建议使用RabbitMQ和Redis)。

app.py:

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应用,然后启动另一个过程来运行你的Celery工作者。

$ celery worker -A app.celery --loglevel=debug


 类似资料:
  • 问题内容: 我想在每次执行Flask路由时执行一个异步函数。为什么函数从不执行? 我还尝试将阻塞调用放在单独的线程中。但是它仍然没有调用该函数。 问题答案: 你可以将一些异步功能整合到Flask应用中,而不必完全将其转换为异步。 这将阻止Flask响应,直到异步函数返回为止,但是它仍然允许你做一些聪明的事情。我已经使用此模式使用aiohttp并行执行许多外部请求,然后在完成它们之后,我回到传统的f

  • 参考DEMO:异步任务处理 异步任务管理器类:EasySwoole\Core\Swoole\Task\TaskManager 在服务启动后的任意一个地方,都可以进行异步任务的投递,为了简化异步任务的投递,框架封装了任务管理器,用于投递同步/异步任务,投递任务有两种方式,一是直接投递闭包,二是投递任务模板类 直接投递闭包 任务比较简单的情况下可以直接投递闭包,任意地方包括控制器/定时器/服务启动后的

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,

  • 这是在一次Android采访中被问到的。有人问我是否可以从异步任务 1 的 doInBackground() 方法(让它成为 Task1)启动另一个异步任务(让它成为 Task2)。我浏览了文档,其中说了以下内容: 必须在UI线程上创建任务实例。 必须在 UI 线程上调用 execute(Params...)。 根据这些陈述,我认为从另一个任务的后台方法启动一个任务是不可能的。此外,async任务

  • 在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。 Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。 程序代码 基于第一个TCP服务器,只需要增加onTask和onFinish 2个事件回调函数即可。另外需要设置task

  • 我正在探索使用Spring Boot的异步servlet。据我所知,异步servlet用于在一个线程中执行长时间运行的任务,而不是容器为处理请求而启动的线程,这样容器就可以使用自己的线程来处理其他连接。基于这样的理解,我尝试了以下代码: 但问题是,运行的同一线程正在调用方法。不是应该不一样吗?