ユーザーにデータベースクエリサービスを提供できる tornado に基づく Web サービスを実装したいと考えています。pyodbc モジュールを使用してデータベースに接続し、クエリを実行しました。実際には、クエリ結果の出力には時間がかかることがわかりました。つまり、次のコードを使用してクエリ結果を出力した場合
while 1:
data = cursor.fetchone()
if not data: break
self.write(data + '\n')
self.flush()
SQLコマンドは次のようなものです
select * from <a large dummy table>
tornado は、ループが終了するまでクエリ結果を出力しません。そして、それには長い時間がかかります。
現在のユーザーのクエリ要求を出力するためのループがまだ終了していなくても、tornado のノンブロッキング非同期機能を利用して、他のユーザーも 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 を使用することはできません。なぜなら、反復がどれくらい続くかを把握する方法がないからです。では、どうすればこれを乗り越えて目標を達成できるでしょうか?