【问题标题】:Tornado async call to a functionTornado 对函数的异步调用
【发布时间】:2012-11-08 19:58:35
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • gen.Task 可以正常工作。如果您的文件获取/生成代码不能很好地发挥作用,那么线程将正常工作。您也可以生成多个进程,但我不知道 Google App Engine 的限制。
  • 感谢您的回复。你是否也知道如果我生成多个 gen.Task 会怎样?我的意思是,我的 instance method 可能会非常耗费 CPU 和时间,如果这个方法被多个用户多次调用,会发生什么情况?所有方法会并行异步运行,还是下一个方法会等待前一个方法首先终止? (请注意,我在整个应用程序中都使用了我的类的一个实例)
  • 完全空白,应该没问题,但无论您的解决方案如何,它都会成为很多线程的问题。如果这令人担忧,请尝试拆分为单独的进程或在负载平衡后运行多个实例。
  • 非常感谢 Sean 的回答。是的,我确实会在后台创建一个负载均衡器应用程序,该应用程序将在后台运行 CPU 繁重的任务,因此用户将始终拥有可用的文件。

标签: python class function asynchronous tornado


【解决方案1】:

我找到了问题的答案:genTask 示例确实是实现异步调用的最佳方式,这是因为该示例确实使用了 Python 协程,乍一看我不明白,因为我认为 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)

【讨论】:

【解决方案2】:

现在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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多