Flask:在请求中生成单个异步子任务

时间:2018-02-02 14:23:29

标签: python multithreading asynchronous

我已经看到了我的问题的一些变体,但并不完全是我正在寻找的,因此开启了一个新问题。

我有一个Flask / Gunicorn应用程序,每个请求都会在商店中插入一些数据,从而启动索引作业。索引是主数据写入的2-4倍,我希望异步执行此操作以减少响应延迟。

对于大型请求正文,整个请求的生命周期为100-150毫秒。

我已经考虑过几种方法,尽可能节省资源:

  • 使用芹菜。这似乎是最明显的方法,但我不想引入一个大型库,最重要的是,它依赖于Redis或其他系统包。
  • 使用subprocess.Popen。这可能是一条很好的路线,但我的瓶颈是I / O,因此线程可能更有效率。
  • 使用线程?我不知道如何做到这一点。我所知道的是如何与ThreadPoolExecutor同时启动多个进程,但我只需要生成一个额外的任务,并立即返回而不等待结果。
  • asyncio?这也是我不知道如何适用于我的情况。 asyncio始终有阻止通话。
  • 同时启动数据写入和索引:不可行。我必须等待数据写入的响应才能启动索引。

欢迎任何建议!

感谢。

2 个答案:

答案 0 :(得分:0)

芹菜将是你最好的选择 - 它正是它的用途。

如果您需要引入依赖项,那么拥有依赖项并不是一件坏事。只要您没有不必要的依赖项。

但是,根据您的体系结构,可能会提供更高级和锁定的解决方案。如果您正在使用AWS,则可以通过触发AWS SNS通知来启动AWS Lambda函数,并让它处理它需要执行的操作。天空是极限。

答案 1 :(得分:0)

我实际上应该更好地阅读关于并发性的Python手册部分:threading模块正是我所需要的:https://docs.python.org/3.5/library/threading.html

我确认了一些假睡眠代码,即使Flask请求完成后子线程也会完成。