我想實現一個基於龍捲風的Web服務,它可以爲用戶提供數據庫查詢服務。我使用pyodbc模塊連接到數據庫並執行查詢。實際上,我發現打印查詢結果需要很長時間。也就是說,如果我用下面的代碼打印查詢結果與Tornado和pyodbc的異步調用
while 1:
data = cursor.fetchone()
if not data: break
self.write(data + '\n')
self.flush()
和SQL命令是一樣的東西
select * from <a large dummy table>
龍捲風,直到循環結束不打印查詢結果。這需要很長時間。
我想使用龍捲風的非阻塞異步功能,使其他用戶也能夠使用Web服務,即使打印當前用戶的查詢請求的循環尚未完成。
所以我寫的東西,如:
@tornado.web.asynchronous
def get(self):
try:
cnxn = pyodbc.connect(self.server, self.driver, self.table, self.uid, self.pwd)
except Exception, e:
print e
return
try:
self.cur = cnxn.execute(self.sql)
except Exception, e:
print e
return
self.wait_for_query(callback=self.async_callback(self.on_finish))
def wait_for_query(self, callback):
while 1:
data = self.cur.fetchone()
if not data: break
self.write(data)
self.flush()
callback()
def on_finish(self):
self.finish()
我看到這篇文章: Asynchronous COMET query with Tornado and Prototype ,知道我的解決辦法是行不通的。但我當然不能使用add_timeout,因爲我無法弄清楚迭代持續的時間。那麼,我如何通過這個工作來實現我的目標呢?