Tornado异步调用函数

gab*_*ous 6 python asynchronous class function tornado

我正在使用Python + Tornado创建一个Web应用程序,它基本上为用户提供文件.我没有数据库.

如果文件可用,则直接拾取和提供文件,如果没有,则立即生成.

我希望以异步方式提供客户端,因为某些文件可能已经可用,而其他文件需要生成(因此需要等待,我不希望它们阻止其他用户).

我有一个管理文件选择或生成的类,我只需要从Tornado调用它.

实现这一目标的最佳方法(在CPU和RAM上最有效)是什么?我应该使用线程吗?一个子流程?一个简单的gen.Task喜欢这个吗?

另外,我希望我的实现能够在Google App Engines上运行(我认为它们不允许生成子流程吗?).

我对异步Web服务比较新,所以欢迎任何帮助.

gab*_*ous 10

我找到了我的问题的答案:genTask示例确实是实现异步调用的最佳方式,这是因为该示例确实使用了Python协程,乍一看我并不理解,因为我认为yield只用于返回生成器的值.

具体例子:

class MyHandler(tornado.web.RequestHandler):

    @asynchronous
    @gen.engine
    def get(self):
        response = yield gen.Task(self.dosomething, 'argument')
Run Code Online (Sandbox Code Playgroud)

这里重要的是两件事的结合:

因此,使用协同程序在Python中进行异步调用的规范示例:

response = yield non_blocking_func(**kwargs)
Run Code Online (Sandbox Code Playgroud)