烧瓶长的例程

sas*_*hab 6 python long-running-processes flask gunicorn

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

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

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

    return "Working..."
Run Code Online (Sandbox Code Playgroud)

但它创造了已经不复存在的枪支工人.

怎么解决?我应该使用像芹菜这样的东西吗?

pac*_*cha 11

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

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

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

当然,您必须考虑存储计算结果的位置以及错误发生的情况.

与芹菜一起使用也很容易.它看起来如下.要定义要异步执行的函数:

@celery.task
def mytask(data):

    ... do a lot of work ...
Run Code Online (Sandbox Code Playgroud)

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

result = mytask.delay(mydata)
Run Code Online (Sandbox Code Playgroud)

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

result.ready()
Run Code Online (Sandbox Code Playgroud)

但是,请记住,要使用Celery,您必须运行外部工作进程.

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

无论如何,任何这些解决方案都应该与Flask一起使用.要检查的结果并不重要,在所有的,如果你使用JavaScript.只需创建检查状态的视图返回JSON(您可以使用Flask jsonify).