2012-03-27 83 views
0

我正在使用urllib2.urlopen()來打開有時可能存在的大文件。我有一個信號處理程序來捕獲SIGTERM,但是當它下載一個大文件來立即關閉我的程序時,實際上是否可以中斷urlopen(),而無需等待該呼叫完成?Python:用SIGTERM打斷urllib2.urlopen()

回答

0

urlopen返回一個類似文件的對象。只有在您對此對象發出.read()請求時纔會通過網絡發送數據。 (你的操作系統會對網絡數據做一些緩衝,所以這並不是真的,但它足夠接近所有的實際用途。)

因此,只需使用.read()方法的能力來讀取塊中的數據,使用循環,也許16K或64K,而不是一次檢索整個文件。然後,在信號處理程序中,可以關閉類似文件的對象,並且在當前塊完成後文件將停止下載。您使用的塊越小,停止下載的延遲就越小。

我會使用一個全局變量來保存對文件類對象的引用,以便它可以在您的信號處理程序中訪問;在這種情況下,它似乎是最簡單的解決方案。

如果在關閉它之後碰巧試圖從類文件對象中讀取,則會得到一個可以正常處理的異常。

相關問題