【问题标题】:Python: interrupting urllib2.urlopen() with SIGTERMPython:使用 SIGTERM 中断 urllib2.urlopen()
【发布时间】:2012-04-11 11:06:48
【问题描述】:

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

【问题讨论】:

    标签: python signals urllib2 sigterm


    【解决方案1】:

    urlopen 返回一个类似文件的对象。仅当您对此对象发出.read() 请求时,才会通过网络发送数据。 (您的操作系统对网络数据进行了一些缓冲,所以这并不完全正确,但对于所有实际目的来说已经足够接近了。)

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

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

    如果你碰巧在关闭类文件对象后尝试读取它,你会得到一个异常,你可以优雅地处理它。

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多