Я хочу реализовать веб-сервис на основе торнадо, который может предоставлять пользователям сервис запросов к базе данных.Я использовал модуль pyodbc для подключения к базе данных и выполнения запроса.На практике я обнаружил, что печать результата запроса займет много времени.То есть, если бы я использовал следующий код для печати результата запроса
while 1:
data = cursor.fetchone()
if not data: break
self.write(data + '\n')
self.flush()
, а команда sql была бы похожа на
select * from <a large dummy table>
, торнадо не напечатало бы результат запроса, покацикл окончен.И это занимает много времени.
Я хочу использовать неблокирующую асинхронную функцию торнадо, чтобы другие пользователи также могли использовать веб-сервис, даже если цикл печати запроса запроса текущего пользователя еще не завершен.пока.
Поэтому я пишу что-то вроде:
@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()
Я прочитал этот пост: Асинхронный запрос COMET с Tornado и Prototype и знал, что мое решение не сработает.Но я, конечно, не могу использовать add_timeout, потому что у меня нет возможности выяснить, как долго продлится итерация.Так как же мне пройти через это, чтобы достичь своей цели?