gpt4 book ai didi

python - Flask长例程

转载 作者:太空狗 更新时间:2023-10-29 22:11:40 26 4
gpt4 key购买 nike

我必须在我的 Flask 应用程序中做一些长时间的工作。我想异步进行。开始工作,然后从 javascript 检查状态。

我正在尝试做类似的事情:

@app.route('/sync')
def sync():
p = Process(target=routine, args=('abc',))
p.start()

return "Working..."

但这会产生已失效的 gunicorn worker 。

如何解决?我应该使用 Celery 之类的东西吗?

最佳答案

有很多选择。您可以开发自己的解决方案,使用 Celery 或 Twisted(我确信那里有更多现成的选项,但这些是最常见的选项)。

开发内部解决方案并不困难。您可以使用 Python 标准库的 multiprocessing 模块:

  • 当任务到达时,您在数据库中插入一行,其中包含任务 ID 和状态。
  • 然后启动一个进程来执行在完成时更新行状态的工作。
  • 你可以有一个 View 来检查任务是否完成,实际上只是检查相应的状态。

当然,您必须考虑要将计算结果存储在何处以及出现错误时会发生什么情况。

使用 Celery 也很容易。它看起来像下面这样。定义一个异步执行的函数:

@celery.task
def mytask(data):

... do a lot of work ...

然后不要直接调用任务,比如 mytask(data),它会立即执行它,而是使用 delay 方法:

result = mytask.delay(mydata)

最后,您可以使用 ready 检查结果是否可用:

result.ready()

但是,请记住,要使用 Celery,您必须运行一个外部 worker 进程。

我从来没有看过 Twisted,所以我不能告诉你它是否比这更复杂或更简单(但做你想做的事也应该没问题)。

无论如何,这些解决方案中的任何一个都应该适用于 Flask。要检查结果,完全是否使用 Javascript 并不重要。只需让检查状态的 View 返回 JSON(您可以使用 Flask 的 jsonify)。

关于python - Flask长例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com