1

以下は、私の問題の最も簡単な例です。

リクエストが発行されると印刷されRequest via GET <__main__.MainHandler object at 0x104041e10>、リクエストはオープンのままになります。良い!MainHandler.getただし、別のリクエストを行うと、最初の接続が完了するまでメソッドは呼び出されません。

get複数のリクエストをロングポーリングのままにして、メソッドに複数のリクエストを取得するにはどうすればよいですか。redis を介して pub/sub から異なる結果を取得する各リクエストで引数を渡しています。問題は、一度に 1 つの接続しか取得できないことです。どうしたの?そして、なぜこれが他のリクエストをブロックしているのでしょうか?

import tornado.ioloop
import tornado.web
import os


class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        print 'Request via GET', self


if __name__ == '__main__':
    application = tornado.web.Application([
        (r"/", MainHandler)])

    try:
        application.listen(int(os.environ.get('PORT', 5000)))
        tornado.ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        tornado.ioloop.IOLoop.instance().stop()

図の左: 上記の問題で説明したとおり。要求は、右の図で要求された方法で処理されません。 右側の図は、リクエスト (広告) が RequestHandler によって処理される必要があり、pub/sub がデータをアナウンスするのを待ちます。

       あいうえお
       + + + + ++ abcd
       | | | | | | | | || + + + +
       | | | | | | | | || | | | | | | | |
       | | | | | | | | || | | | | | | | |
       | | | | | | | | || | | | | | | | |
       | | || vvv || | | | | | | | |
   +---|-----------------------------+ || +-----|----|---|---|------------------+
   | | | | | | || | | | | | | | | | | | |
   | | + RequestHandler| || | | + + + + リクエストハン。| |
   | | | | | | || | | | | | | | | | | | |
   +---|-----------------------------+ || +-----|----|---|---|------------------+
   +---|-----------------------------+ || +-----|----|---|---|------------------+
   | | | | | | || | | | | | | | | | | | |
   | | + サブ/パブ キュー | || | | v + vv キュー |
   | | | | | | || | | | | | |
   +---|-----------------------------+ || +----------|--------------------------+
   +---|-----------------------------+ || +----------|--------------------------+
       | | || | |
       | | || 完了 || | | 終了した
       v || v
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ++

これが別のプログラミング言語で達成できる場合は、お知らせください。

ご協力ありがとうございました!

4

1 に答える 1