4
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 秒間ブロックします。

  1. Browser A は HandlerA によって処理され、待機します...
  2. ブラウザ B は HandlerB によって処理され、タイムアウト例外が発生するまで待機します。

ゴール

  1. Browser A は HandlerA によって処理され、待機します...
  2. ブラウザ B は HandlerB によって処理され、戻ります
  3. デキュー後に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())

今、これはそれを処理するための最良の方法ではありません... しかし、少なくともその始まりです.

解決

こちらにあります Tornado でのブロッキング コードの実行

4

1 に答える 1

1

これはPythonです。だから、time.sleep常に流れをブロックします!tornado.ioloop.add_timeoutTornadoで10秒後にアクションを呼び出すには、関数を使用し、コールバックをパラメーターとして渡す必要があります。詳細については、ドキュメントをご覧ください

于 2012-12-19T21:59:41.527 に答える