2014-01-28 260 views
0

我怎樣才能讓下面的對象實例化異步:異步對象實例化

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

MyDataFrame回報pandasDataFrame對象,可能需要一些時間取決於它來解析文件。

+1

這需要在MyDataFrame中實現,它的構造函數可能需要完全重寫才能利用Tornado的事件循環而不是阻塞。 – lanzz

回答

2

MyDataFrame()是一個同步接口;使用它沒有阻止你需要做兩件事之一:

  • 重寫它是異步的。你不能真正使異步方法成爲一種方法,所以你需要將一些東西重構爲靜態工廠函數而不是構造函數。在大多數情況下,如果該方法依賴於網絡I/O(而不是從文件系統讀取或處理CPU上的結果),則此路徑纔有意義。

  • 在工作線程上運行它,並在主線程上異步等待其結果。從你提出問題的方式來看,這聽起來像是你的正確方法。我推薦使用concurrent.futures包(自Python 3.2以來,在標準庫中;通過pip install futures可用於2.x)。

這看起來是這樣的:

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

其中executorThreadPoolExecutor全局實例。