TurboGearsで出力をストリームする

...というわけで、チャットならば「やっぱリアルタイムだよね。ポーリングしたくないし」、サーバーとクライアントのコネクションをはりっぱにする方法を前もって見つけておこうと思って、調べていました。

結論を言うととても簡単で、

1. CherryPyの stream_response という設定を True にする。

cherrypy.config.update({'/getstrings': {'stream_response': True}})

2. @exposeしたメソッドの戻り値として、ジェネレータを返す。

とすれば、あとはジェネレータが好きなだけクライアントにレスポンスをストリームできます。1.の設定をしないとすべてのレスポンスが揃うまですべてバッファリングしてしまいます。

http://docs.cherrypy.org/return-versus-yield

ハマった点は、エラー出力を格好良くする方法 http://d.hatena.ne.jp/yach/20060919 を使っていると、1.の設定をしても結果がバッファされてしまうこと。これがわからなくて、CherryPyのソースを行ったり来たりすることになりました。まあ勉強になったのでヨシ。