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秒钟。
目标
这是非阻塞,异步,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())
现在这不是处理它的最好方法......但至少它是一个开始。
解
答案 0 :(得分:1)
这是Python。因此,time.sleep
将始终阻止流量!要使用Tornado在10秒后调用操作,您需要使用tornado.ioloop.add_timeout
函数并将回调作为参数传递。 Docs for more information