Flask长程序

发布于 2021-01-29 17:15:48

我必须在Flask应用中做一些长时间的工作。而且我想异步执行。只需开始工作,然后从javascript检查状态即可。

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

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

    return "Working..."

但这会导致已经破产的枪手工人。

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

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

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

    当然,您必须考虑要在哪里存储计算结果以及发生错误时会发生什么。

    和芹菜一起去也很容易。它看起来像下面的样子。定义要异步执行的功能:

    @celery.task
    def mytask(data):
    
        ... do a lot of work ...
    

    然后mytask(data),与其直接调用任务(如,它可以立即执行任务),不如使用delay方法:

    result = mytask.delay(mydata)
    

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

    result.ready()
    

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

    我从没看过Twisted,所以我无法告诉您它是否比这复杂(或稍微复杂一点)(也可以做您想做的事)。

    无论如何,任何这些解决方案都可以在Flask中正常工作。要检查的结果并不重要 ,在所有的
    ,如果你使用JavaScript。只需使检查状态的视图返回JSON(即可使用Flask的jsonify)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看