2012-12-19 26 views
3
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請求塊其它請求,如何不會阻礙其他請求

  1. 瀏覽器通過HandlerA並等待處理...
  2. 瀏覽器甲乙經HandlerB並等待處理,直到....超時異常

目標

  1. 瀏覽器由HandlerA處理並等待...
  2. 瀏覽器B由HandlerB處理並且r eturns
  3. 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

+0

這個問題是在這裏回答的:http://stackoverflow.com/questions/14293238/running-blocking-code-in-tornado/14298520 –

回答

1

發現這是Python的。所以,time.sleep將永遠阻止流量!爲了在Tornado 10秒後調用操作,您需要使用tornado.ioloop.add_timeout函數並將回調傳遞爲參數。 Docs for more information

+0

你是對的。我的問題是沒有使用time.sleep,對於混淆抱歉。但是我使用Queue.Queue同步阻塞。試圖將信息從一個瀏覽器傳遞到另一個瀏覽器。這是否更有意義?我需要讓HandlerA執行一個Queue.Queue.get_nowait(),等待HandlerB執行Queue.Queue.put()調用。我將編輯帖子以反映這一點。抱歉混淆。 –

+0

那麼它是否適用於您更新的代碼? –

+0

爲什麼你使用隊列 - 除非你真實的代碼有線程運行你不需要開銷。你可以使用一個列表或一個deque進行push/pop操作。 – koblas