2012-12-19 2 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.') 

문제 : 10 초 동안 HandlerA 블록 HandlerB. 시간 제한 예외까지 .... HandlerB과 대기에 의해 처리 HandlerA과 대기에 의해 처리토네이도 웹 HTTP 요청 블록 다른 요청, 다른 요청

  1. 브라우저 A를 ...
  2. 브라우저 B

목표

  1. 브라우저 HandlerA가 처리하고 기다리는 중 ...
  2. 브라우저 B가 HandlerB에서 처리하고 r

이 비 차단, 비동기, epoll 파일 또는 소켓에 문제인가를 대기열에서 제외 후

  • HandlerA 반환 eturns?

    감사합니다.

    업데이트 :

    나는 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()) 
    

    이제는이 문제를 해결하는 가장 좋은 방법은 아니지만 최소한 시작점입니다.

    솔루션

    여기 Running blocking code in Tornado

  • +0

    이 질문은/문제는 여기에 답변 : http://stackoverflow.com/questions/14293238/running-blocking-code-in-tornado/14298520 –

    답변

    1

    찾을 이것은 파이썬입니다. 따라서 time.sleep은 항상 흐름을 차단합니다. 토네이도로 10 초 후에 액션을 호출하려면 tornado.ioloop.add_timeout 함수를 사용하고 콜백을 param으로 전달해야합니다. Docs for more information.

    +0

    당신이 맞습니다. 내 문제는 시간을 사용하지 않습니다. 잠깐, 혼란스러워서 죄송합니다. 하지만 Queue.Queue 동기 차단을 사용하고 있습니다. 한 브라우저에서 다른 브라우저로 정보를 전달하려고합니다. 이것이 더 의미가 있습니까? HandlerA에게 Queue.Queue.get_nowait()을 수행시켜야 HandlerB가 Queue.Queue.put() 호출을 기다리고 있습니다. 이를 반영하여 게시를 수정하겠습니다. 혼란을 드려 죄송합니다. –

    +0

    업데이트 된 코드와 함께 작동합니까? –

    +0

    왜 실제 코드에 오버 헤드가 필요없는 주변에서 실행되는 스레드가 없다면 큐를 전혀 사용하지 않는 것입니다. 푸시/팝 조작에 대해 목록이나 양면 비누를 사용할 수 있습니다. – koblas