异步对象实例化

时间:2014-01-28 16:00:10

标签: python asynchronous tornado

如何使以下对象实例化异步:

class IndexHandler(tornado.web.RequentHandler):
    def get(self, id):
        # Async the following
        data = MyDataFrame(id)
        self.write(data.getFoo())

MyDataFrame会返回pandas DataFrame个对象,并且可能需要一些时间,具体取决于它必须解析的文件。

1 个答案:

答案 0 :(得分:2)

MyDataFrame()是一个同步接口;要使用它而不阻止你需要做两件事之一:

  • 将其重写为异步。你不能真正使__init__方法异步,所以你需要将事物重构为静态工厂函数而不是构造函数。在大多数情况下,只有当方法依赖于网络I / O(而不是从文件系统读取或在CPU上处理结果)时,此路径才有意义。

  • 在工作线程上运行它,并在主线程上异步等待其结果。从您提出问题的方式来看,这听起来像是适合您的方法。我推荐concurrent.futures包(自Python 3.2以来在标准库中;对于2.x可通过pip install futures获得)。

这看起来像是:

@tornado.gen.coroutine
def get(self, id):
    data = yield executor.submit(MyDataFrame, id)
    self.write(data.getFoo())

其中executorThreadPoolExecutor的全局实例。