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 秒。
- 浏览器 A 由 HandlerA 处理并等待...
- 浏览器 B 由 HandlerB 处理并等待....直到超时异常
目标
- 浏览器 A 由 HandlerA 处理并等待...
- 由 HandlerB 处理并返回的浏览器 B
- 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 中运行阻塞代码