我有两个请求者。一个提供大量的auf数据,另一个只提供几个数据集。
class HugeQueryHandler(BaseHandler):
@gen.coroutine
def get(self):
try:
cursor = yield momoko.Op(self.db.execute, 'SELECT * FROM huge_table;')
for row in cursor:
self.write('Query results: {} <br />'.format(row))
except Exception as error:
self.write(str(error))
self.finish()。
class SmallQueryHandler(BaseHandler):
@gen.coroutine
def get(self):
try:
cursor = yield momoko.Op(self.db.execute, 'SELECT * FROM small_table;')
for row in cursor:
self.write('Query results: {} <br />'.format(row))
except Exception as error:
self.write(str(error))
self.finish()我的问题
响应循环阻塞吗?当我在调用大型处理程序之后请求少量数据时,我必须等待,等待第一个数据完成.
发布于 2013-12-23 18:45:32
write()不会阻塞网络(它只是附加到缓冲区),但是您不会在任何地方产生结果,所以在任何其他任务能够运行之前,整个循环必须运行到完成。我认为问题不是写问题,而是迭代--“行在光标中”不会产生结果,所以momoko在内存中缓冲了整个结果集,或者在从数据库读取时阻塞了。如果是后者,则需要以非阻塞方式访问游标。如果是前者,那么除了将查询分解成更小的块之外,您可能没有什么可以做的。(在循环期间,您可以偶尔调用“gen.Task(self.flush)”,但这会延长内存中缓冲全部数量的时间,因此可能不可取)。
发布于 2013-12-23 23:21:11
所以,这就是重点。for循环需要完成。
这种方法是怎么回事?
class HugeQueryHandler(BaseHandler):
executor = tornado.concurrent.futures.ThreadPoolExecutor(1)
@tornado.concurrent.run_on_executor
def generate_response(self, cursor):
return "<br />".join("{}".format(row) for row in cursor)
@tornado.web.asynchronous
@gen.engine
def get(self):
try:
cursor = yield momoko.Op(self.db.execute, 'SELECT * FROM huge_table;')
res = yield self.generate_response(cursor)
self.write(res)
except Exception as error:
self.write(str(error))
self.finish()https://stackoverflow.com/questions/20745563
复制相似问题