urlopen
возвращает файл-подобный объект. Данные отправляются только по сети, когда вы делаете запрос .read()
для этого объекта. (Ваша ОС выполняет некоторую буферизацию сетевых данных, так что это не совсем верно, но это достаточно близко для всех практических целей.)
Так что просто используйте возможность метода .read()
для чтения данных по частям, используя цикл, возможно, 16 КБ или 64 КБ за раз, а не извлекайте весь файл сразу. Затем в обработчике сигналов вы можете закрыть файлоподобный объект, и файл прекратит загрузку после завершения текущего фрагмента. Чем меньше используемый вами блок, тем меньше будет задержка при остановке загрузки.
Я бы использовал глобальную переменную для хранения ссылки на файлоподобный объект, чтобы он был доступен в вашем обработчике сигналов; в этом случае это кажется самым простым решением.
Если вам случится попытаться прочитать файлоподобный объект после его закрытия, вы получите исключение, которое вы можете обработать изящно.