在Flask中进行异步任务

我正在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中进行异步任务 的全部内容, 来源链接: utcz.com/qa/435037.html

回到顶部