Tornado异步调用函数

2024-03-28 19:00:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python+Tornado制作一个web应用程序,它基本上为用户提供文件。我没有数据库。

如果文件可用,则直接获取和提供这些文件,如果不可用,则动态生成这些文件。

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

我有一个类来管理文件的选取或生成,我只需要从Tornado中调用它。

实现这一目标的最佳方法是什么(CPU和RAM效率最高)?我应该用线吗?一个子过程?一个简单的gen.Task like this one

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

我对异步web服务比较陌生,所以欢迎任何帮助。


Tags: 文件方法用户web数据库应用程序客户端目标
2条回答

我已经找到了问题的答案:genTask示例确实是实现异步调用的最佳方法,这是因为该示例确实使用了Python coroutine,我一眼就不明白,因为我认为yield只用于返回生成器的值。

具体例子:

class MyHandler(tornado.web.RequestHandler):

    @asynchronous
    @gen.engine
    def get(self):
        response = yield gen.Task(self.dosomething, 'argument')

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

因此,Python中使用协程的异步调用的规范示例如下:

response = yield non_blocking_func(**kwargs)

现在Documentation有解了。

简单示例:

import os.path
import tornado.web
from tornado import gen

class MyHandler(tornado.web.RequestHandler):

    @gen.coroutine
    def get(self, filename):
        result = yield self.some_usefull_process(filename)
        self.write(result)

    @gen.coroutine
    def some_usefull_process(self, filename):
        if not os.path.exists(filename):
            status = yield self.generate_file(filename)
            result = 'File created'
        else:
            result = 'File exists'

        raise gen.Return(result)

    @gen.coroutine
    def generate_file(self, filename):
        fd = open(filename, 'w')
        fd.write('created')
        fd.close()

相关问题 更多 >