Python: прерывание urllib2.urlopen () с помощью SIGTERM - PullRequest
0 голосов
/ 28 марта 2012

Я использую urllib2.urlopen () для открытия иногда потенциально больших файлов.У меня есть обработчик сигнала для перехвата SIGTERM, но возможно ли на самом деле прерывать urlopen () при загрузке большого файла, чтобы немедленно закрыть мою программу, не дожидаясь завершения вызова?

1 Ответ

0 голосов
/ 28 марта 2012

urlopen возвращает файл-подобный объект. Данные отправляются только по сети, когда вы делаете запрос .read() для этого объекта. (Ваша ОС выполняет некоторую буферизацию сетевых данных, так что это не совсем верно, но это достаточно близко для всех практических целей.)

Так что просто используйте возможность метода .read() для чтения данных по частям, используя цикл, возможно, 16 КБ или 64 КБ за раз, а не извлекайте весь файл сразу. Затем в обработчике сигналов вы можете закрыть файлоподобный объект, и файл прекратит загрузку после завершения текущего фрагмента. Чем меньше используемый вами блок, тем меньше будет задержка при остановке загрузки.

Я бы использовал глобальную переменную для хранения ссылки на файлоподобный объект, чтобы он был доступен в вашем обработчике сигналов; в этом случае это кажется самым простым решением.

Если вам случится попытаться прочитать файлоподобный объект после его закрытия, вы получите исключение, которое вы можете обработать изящно.

...