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秒。龍捲風網頁http請求塊其它請求,如何不會阻礙其他請求
- 瀏覽器通過HandlerA並等待處理...
- 瀏覽器甲乙經HandlerB並等待處理,直到....超時異常
目標
- 瀏覽器由HandlerA處理並等待...
- 瀏覽器B由HandlerB處理並且r eturns
- HandlerA 回報離隊
這是非阻塞,異步的epoll或插座的問題之後?
謝謝!
UPDATE:
我更新了這個代碼用新的線程來處理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())
現在,這是不處理它的最佳方式......但至少它是一個開始。
SOLUTION
這裏Running blocking code in Tornado
這個問題是在這裏回答的:http://stackoverflow.com/questions/14293238/running-blocking-code-in-tornado/14298520 –