这是我的代码:
class AsyncTestHandler(BaseHandler):
def testTimeOut(self, callback):
time.sleep(20)
callback("ok")
@tornado.web.asynchronous
def post(self):
user = self.get_current_user()
self.testTimeOut(callback=self.respones)
def respones(self,msg):
self.finish(msg)
我用过" @ tornado.web.asynchronous"有回调,但请求不是异步的,怎么可以id?
答案 0 :(得分:1)
Tornado只使用一个进程和一个线程。其中的所有IO操作都是异步的,这并不意味着它们是同时处理的。所以,如果您在任何地方的代码中调用time.sleep(xx)
,那么您的Tornado流程将完全“停止”!
在Tornado睡觉的正确方法是致电ioloop.add_timeout
。
请参阅tornado equivalent of delay。
请参阅http://caisong.com/Tornado%20don't%20use%20time.sleep%20.html。
答案 1 :(得分:1)
问题是,time.sleep不是异步的,因此主循环在休眠时被阻止。为了异步运行同步代码,您可以使用单独的工作线程。
class HugeQueryHandler(BaseHandler):
executor = tornado.concurrent.futures.ThreadPoolExecutor(5)
@tornado.concurrent.run_on_executor
def sleep_async(self):
time.sleep(20)
return
@tornado.web.asynchronous
@gen.engine
def get(self):
r = yield self.sleep_async()
self.finish()