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?
问问题
394 次
1 回答
0
urlopen
返回一个类似文件的对象。.read()
仅当您对此对象发出请求时,才会通过网络发送数据。(您的操作系统对网络数据进行了一些缓冲,所以这并不完全正确,但对于所有实际目的来说已经足够接近了。)
因此,只需使用该.read()
方法的功能,使用循环读取数据块,一次可能 16K 或 64K,而不是一次检索整个文件。然后,在您的信号处理程序中,您可以关闭类似文件的对象,并且在当前块完成后文件将停止下载。您使用的块越小,停止下载的延迟就越少。
我会使用一个全局变量来保存对类文件对象的引用,以便在您的信号处理程序中可以访问它;在这种情况下,它似乎是最简单的解决方案。
如果你碰巧在关闭文件类对象后尝试读取它,你会得到一个异常,你可以优雅地处理它。
于 2012-03-27T21:12:07.167 回答