龙卷风异步请求不起作用,我的代码出了什么问题?

时间:2014-07-13 10:46:12

标签: python asynchronous tornado

这是我的代码:

 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?

2 个答案:

答案 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()