2012-03-27 8 views
0

Ich benutze urllib2.urlopen(), um manchmal potenziell große Dateien zu öffnen. Ich habe einen Signalhandler, um SIGTERM zu fangen, aber ist es möglich, urlopen() zu unterbrechen, wenn es eine große Datei herunterlädt, um mein Programm sofort zu schließen, ohne auf das Ende des Anrufs zu warten?Python: urllib2.urlopen() mit SIGTERM unterbrechen

Antwort

0

urlopen gibt ein dateiähnliches Objekt zurück. Daten werden nur über das Netzwerk gesendet, wenn Sie eine .read() Anfrage für dieses Objekt machen. (Ihr Betriebssystem puffert Netzwerkdaten, dies ist jedoch nicht streng zutreffend, aber für praktische Zwecke nah genug.)

Verwenden Sie einfach die .read()-Methode zum Lesen von Daten in Blöcken mit einer Schleife, vielleicht 16K oder 64K gleichzeitig, anstatt die gesamte Datei auf einmal abzurufen. In Ihrem Signalhandler können Sie dann das dateiähnliche Objekt schließen, und die Datei wird nach dem Abschluss des aktuellen Chunks nicht mehr heruntergeladen. Je kleiner der verwendete Chunk ist, desto geringer ist die Latenz beim Stoppen des Downloads.

Ich würde eine globale Variable verwenden, um den Verweis auf dateiähnliche Objekt zu halten, so dass es in Ihrem Signal-Handler zugänglich ist; In diesem Fall scheint es die einfachste Lösung zu sein.

Wenn Sie zufällig versuchen, nach dem Schließen von dem dateiartigen Objekt zu lesen, erhalten Sie eine Ausnahme, die Sie elegant behandeln können.