0

I'm using urllib2.urlopen() to open sometimes potentially large files. I have a signal handler to catch SIGTERM, but is it possible to actually interrupt urlopen() when it's downloading a big file to close my program immediately, without waiting for the call to finish?

4

1 に答える 1

0

urlopenファイルのようなオブジェクトを返します。.read()このオブジェクトでリクエストを行った場合にのみ、データがネットワーク経由で送信されます。(OSはネットワークデータのバッファリングを行うため、これは厳密には当てはまりませんが、すべての実用的な目的には十分に近いものです。)

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

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

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

于 2012-03-27T21:12:07.167 に答える