2012-03-27 85 views
0

我正在使用urllib2.urlopen()来打开有时可能存在的大文件。我有一个信号处理程序来捕获SIGTERM,但是当它下载一个大文件来立即关闭我的程序时,实际上是否可以中断urlopen(),而无需等待该呼叫完成?Python:用SIGTERM打断urllib2.urlopen()

回答

0

urlopen返回一个类似文件的对象。只有在您对此对象发出.read()请求时才会通过网络发送数据。 (你的操作系统会对网络数据做一些缓冲,所以这并不是真的,但它足够接近所有的实际用途。)

因此,只需使用.read()方法的能力来读取块中的数据,使用循环,也许16K或64K,而不是一次检索整个文件。然后,在信号处理程序中,可以关闭类似文件的对象,并且在当前块完成后文件将停止下载。您使用的块越小,停止下载的延迟就越小。

我会使用一个全局变量来保存对文件类对象的引用,以便它可以在您的信号处理程序中访问;在这种情况下,它似乎是最简单的解决方案。

如果在关闭它之后碰巧试图从类文件对象中读取,则会得到一个可以正常处理的异常。

相关问题