4
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 处理并等待....直到超时异常

目标

  1. 浏览器 A 由 HandlerA 处理并等待...
  2. 由 HandlerB 处理并返回的浏览器 B
  3. HandlerA出队后返回

这是非阻塞、异步、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())

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

解决方案

在这里找到在 Tornado 中运行阻塞代码

4

1 回答 1

1

这是 Python。所以,time.sleep总会堵住人流!为了使用 Tornado 在 10 秒后调用动作,您需要使用tornado.ioloop.add_timeout函数并将回调作为参数传递。文档以获取更多信息

于 2012-12-19T21:59:41.527 回答