2012-03-27 10 views
0

urllib2.urlopen()を使用して、大規模なファイルを開くことがあります。私はSIGTERMを捕まえるためのシグナルハンドラを持っていますが、呼び出しを完了するのを待つことなく、大きなファイルをダウンロードしてすぐにプログラムを閉じるためにurlopen()を実際に中断することは可能ですか?Python:SIGTERMでurllib2.urlopen()を中断する

答えて

0

urlopenはファイルのようなオブジェクトを返します。このオブジェクトに対して.read()要求を行うと、データはネットワーク経由でのみ送信されます。

.read()メソッドを使用すると、ループを使用してチャンク内のデータを読み取ることができます(おそらく16Kです)。一度にファイル全体を取得するのではなく、一度に64Kを使用します。あなたのシグナルハンドラでは、ファイルのようなオブジェクトを閉じることができ、現在のチャンクが終了した後にファイルのダウンロードが停止されます。使用するチャンクが小さければ小さいほど、ダウンロードを停止するレイテンシが少なくなります。

ファイルハンドラでアクセスできるように、グローバル変数を使用してファイルライクなオブジェクトへの参照を保持します。この場合、最も単純な解決策のようです。

ファイルのようなオブジェクトを閉じた後にそれを読み込もうとすると、正常に処理できる例外が発生します。

関連する問題