Tornado のチャット デモでは、次のようなメソッドがあります。
@tornado.web.asynchronous
def post(self):
cursor = self.get_argument("cursor", None)
global_message_buffer.wait_for_messages(self.on_new_messages,
cursor=cursor)
私はこの長いポーリングにかなり慣れていないため、スレッド化がどのように機能するかを正確には理解していませんが、次のように述べています。
ノンブロッキング ネットワーク I/O を使用することで、Tornado は数万のオープン接続に拡張できます...
私の理論は、単純なアプリを作成することで、次のようになりました。
import tornado.ioloop
import tornado.web
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
print("Start request")
time.sleep(4)
print("Okay done now")
self.write("Howdy howdy howdy")
self.finish()
application = tornado.web.Application([
(r'/', MainHandler),
])
2 つのリクエストを連続して行った場合 (つまり、2 つのブラウザ ウィンドウを開き、両方をすばやく更新した場合)、次のように表示されます。
Start request
Start request
Okay done now
Okay done now
代わりに、私は見る
Start request
Okay done now
Start request
Okay done now
これにより、この場合、実際にはブロックされていると思います。私のコードがブロックされているのはなぜですか? また、コードに期待どおりの動作をさせるにはどうすればよいですか? コアi7を搭載したWindows 7と、2つのコアを搭載したLinux Mint 13ボックスで同じ出力が得られます。
編集:
私は1つの方法を見つけました-誰かがクロスプラットフォームで機能する方法を提供できる場合(私はパフォーマンスについてあまり心配していませんが、それがノンブロッキングであることだけを心配しています)、私はその答えを受け入れます.