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 秒間ブロックします。
- Browser A は HandlerA によって処理され、待機します...
- ブラウザ B は HandlerB によって処理され、タイムアウト例外が発生するまで待機します。
ゴール
- Browser 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())
今、これはそれを処理するための最良の方法ではありません... しかし、少なくともその始まりです.
解決