龙卷风web http请求阻止其他请求,如何不阻止其他请求

时间:2012-12-19 21:51:49

标签: python http asynchronous tornado nonblocking

import tornado.web
import Queue

QUEUE = Queue.Queue()

class HandlerA( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        self.finish(QUEUE.get_nowait())

class HandlerB( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        QUEUE.put('Hello')
        self.finish('In queue.')

问题: HandlerA会阻止HandlerB 10秒钟。

  1. 浏览器A由HandlerA处理并等待......
  2. 浏览器B由HandlerB处理并等待....直到超时异常
  3. 目标

    1. 浏览器A由HandlerA处理并等待......
    2. 浏览器B由HandlerB处理,返回
    3. 出现
    4. 后,
    5. HandlerA 返回
    6. 这是非阻塞,异步,epoll还是套接字的问题?

      谢谢!

      更新

      我使用新线程更新了此代码以处理Queue.get_nowait()请求。我担心这是一个可怕的解决方案,考虑到我将同时拥有数千个请求,因此会同时拥有数千个线程。我正考虑在不久的将来转向epoll风格。

      class HandlerA( tornado.web.RequestHandler ):
          @tornado.web.asynchronous
          def get(self):
             thread.start_new_thread(self.get_next)
      
          def get_next(self):
              global QUEUE
              self.finish(QUEUE.get_nowait())
      

      现在这不是处理它的最好方法......但至少它是一个开始。

      在此处找到Running blocking code in Tornado

1 个答案:

答案 0 :(得分:1)

这是Python。因此,time.sleep将始终阻止流量!要使用Tornado在10秒后调用操作,您需要使用tornado.ioloop.add_timeout函数并将回调作为参数传递。 Docs for more information