【发布时间】:2012-04-11 11:06:48
【问题描述】:
我正在使用 urllib2.urlopen() 打开有时可能很大的文件。我有一个信号处理程序来捕获 SIGTERM,但是当它下载一个大文件以立即关闭我的程序时,是否可以实际中断 urlopen(),而无需等待调用完成?
【问题讨论】:
标签: python signals urllib2 sigterm
我正在使用 urllib2.urlopen() 打开有时可能很大的文件。我有一个信号处理程序来捕获 SIGTERM,但是当它下载一个大文件以立即关闭我的程序时,是否可以实际中断 urlopen(),而无需等待调用完成?
【问题讨论】:
标签: python signals urllib2 sigterm
urlopen 返回一个类似文件的对象。仅当您对此对象发出.read() 请求时,才会通过网络发送数据。 (您的操作系统对网络数据进行了一些缓冲,所以这并不完全正确,但对于所有实际目的来说已经足够接近了。)
因此,只需使用.read() 方法的功能,使用循环读取数据块,一次可能是 16K 或 64K,而不是一次检索整个文件。然后,在您的信号处理程序中,您可以关闭类似文件的对象,并且在当前块完成后文件将停止下载。您使用的块越小,停止下载的延迟就越少。
我会使用一个全局变量来保存对类文件对象的引用,以便在您的信号处理程序中访问它;在这种情况下,这似乎是最简单的解决方案。
如果你碰巧在关闭类文件对象后尝试读取它,你会得到一个异常,你可以优雅地处理它。
【讨论】: