Python falcon和异步操作

Glu*_*eon 5 python falconframework

我正在使用python3 + falcon组合编写API.

在我可以向客户端发送回复的方法中有很多地方,但由于一些繁重的代码执行DB,i/o操作等,它必须等到重要部分结束.

例如:

class APIHandler:                                                                      
  def on_get(self, req, resp):
    response = "Hello"
    #Some heavy code
    resp.body(response)
Run Code Online (Sandbox Code Playgroud)

我可以在第一行代码发送"Hello".我想要的是在后台运行繁重的代码并发送响应,无论重型部件何时完成.

Falcon没有任何内置的异步功能,但他们提到它可以像gevent一样使用.我还没有找到任何关于如何将这两者结合起来的文档.

kgr*_*ffs 7

客户端库对异步操作有不同的支持,因此决策通常取决于您的特定后端客户端最好支持哪种异步方法,以及您希望使用哪种WSGI服务器.另请参阅下面的一些更常见的选项......

对于不支持异步交互模型的库,无论是本机还是通过某种子类化机制,都可以将任务委托给线程池.对于特别长时间运行的任务(即大约几秒或几分钟),Celery不是一个糟糕的选择.

对WSGI(和Falcon)应用程序的一些更常见的异步选项的简要调查:

  • 扭曲.有利于显式的异步风格,可能是最成熟的选择.为了与像Falcon这样的WSGI框架集成,有twisted.web.wsgicrochet.
  • ASYNCIO.借用Twisted的许多想法,但利用Python 3语言功能提供更清晰的界面.从长远来看,这可能是最干净的选择,但需要改进WSGI接口(另请参阅脉冲星对PEP-3333的扩展).在撰写本文时,asyncio生态系统相对年轻; 社区仍在尝试各种各样的接口,模式和工具方法.
  • eventlet.支持一种隐式样式,旨在使异步代码看起来同步.一种方法是通过猴子修补标准库中的I/O模块来实现这一点.有些人不喜欢这种方法,因为它掩盖了异步机制,使边缘情况更难调试.
  • GEVENT.与eventlet类似,虽然有点现代.uWSGI和Gunicorn都支持对标准库进行修补的gevent worker类型.

最后,有可能将Falcon扩展为本机支持twisted.web或asyncio(ala aiohttp),但我认为还没有人尝试过它.


小智 5

我将 Celery 用于异步相关的工作。我不知道 gevent 。看看这个http://celery.readthedocs.org/en/latest/getting-started/introduction.html