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 处理并等待...
- 浏览器 B 由 HandlerB 处理并返回
- 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())
现在这不是处理它的最佳方式......但至少它是一个开始。
解决方案
最佳答案
这是 Python。所以,time.sleep
会一直阻塞流!为了在 10 秒后使用 Tornado 调用操作,您需要使用 tornado.ioloop.add_timeout
函数并将回调作为参数传递。 Docs for more information .
关于python - tornado web http请求阻塞其他请求,如何不阻塞其他请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13961863/