如何使以下对象实例化异步:
class IndexHandler(tornado.web.RequentHandler):
def get(self, id):
# Async the following
data = MyDataFrame(id)
self.write(data.getFoo())
MyDataFrame
会返回pandas
DataFrame
个对象,并且可能需要一些时间,具体取决于它必须解析的文件。
答案 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())
其中executor
是ThreadPoolExecutor
的全局实例。