なんたらノート第三期ベータスマートフォン用の表示で見るなんたらノート第三期ベータこの広告は、90日以上更新していないブログに表示しています。2008-10-08HTTPチャンク転送をPythonで受けるPythonHTTP1.1には、「アプリケーションが明示的にちょっとづつデータを送る」ための、チャンク転送符号化という仕様があります。CRLFという感じになります。この形式でレスポンスが得られれば、クライアントがゆっくりとデータを受信するとき、バッファの大きさをあらかじめ確定できるので、受信の真っ最中に想定サイズを超えるような厄介な問題を防ぐことができ、また、データ形式が線形なものであれば、「受信したところまで表示」できるかもしれません。ひとつのレスポンスが平気で10MB超えたりして、さらに、そんなリクエストを並列で10本以上走らせる、なんていう場合、ひとつのジョブが可変長バッファを物理メモリ上で10MB以上占有する(10MBをちょっと超えるだけで、メモリ再配置のために瞬間的に30MB占有する)なんてのは厳しいですね。数KBごとに、バイト列をそのままディスクか別のソケットに送出できればいいんですが、前後関係に依存してデータ加工してから保存しないといけないなど、単純にたらい回しするわけにもいかない場合もあります。前置きが長くなりました。いうわけで、「いちどに処理していい小さな単位」として、HTTPのチャンクを活かせるなら、ぜひ活かしたいものです。残念なことに、Pythonのhttplibは、レスポンスがせっかくチャンク化されていても、通常のHTTPレスポンスと同じインターフェースで操作することを強制してしまいます。httplibを使うと、チャンクが連続した区切り目のないデータなってしまうというわけ。う〜ん、こんなふうにできたらいいのに。#できたらいいな...と、思っていたら、なんと、そのまんまできるコードがありました。http://projects.dowski.com/view/iresponseHTTPResponseを継承した、__iter__を持つIterableResponseクラスだそうです。while-readじゃなくて、for-inで受信データを受け取れます。チャンク転送ならイテレーションの単位がチャンクになります。これで、巨大なレスポンスでも、チャンク転送なら、随時処理してはメモリを片付けられる。モーションJPEGどんと来い。あれ?このdowskiって名前、見たことあるぞ。思ったら、CherryPyのバグレポのときお世話になった人でした。たしかにCherryPyはチャンク転送できるんだから、クライアント側でも対称な作りができて欲しい。ないと、CherryPyのストリーミング出力をPythonだけで確認できないもんね。(1)月別アーカイブはてなブログをはじめよう!tanakahisateruさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。