Seite 1 von 1

Abbruch bei Urllib

Verfasst: Samstag 25. Dezember 2010, 18:30
von Quitte
Hi,
ich suche eine Möglichkeit eine urllib Anfragen (openurl) nach X Sekunden abzubrechen, falls die Datei nicht geladen ist!


Etwas exakter:
Ich habe folgendes Problem:

Ich habe ein Programm geschrieben welches einige anfragen per Urllib stellt
(mit Wartezeit dazwischen)!

Leider passiert es ab und zu das das programm einfach hängt (wird an urlopen oder das folgende read() liegen)!

Sieht im Endeffekt so aus (natürlich komplizierter mit wechselnder Adresse) Beispiel:

Code: Alles auswählen

import urllib2
import time
def laden():
     for i in range(1000):
          #wechselne adresse
          adresse = ....

          f=open.urlopen(adresse)
          quelltext = f.read(adresse)
          f.close()

          time.sleep(5)

          #geladenes speichern
          f=open(......

laden()
Ab und zu hängt das Programm einfach! Es gibt keinen Fehler aus, keine Rückgabe oder ähnliches, sonder lädt einfach und macht nichts!

Ich suche also eine Möglichkeit die Anfrage abzubrechen, wenn nach 1 Minute kein Ergebnis vorliegt!

Ich habe folgendes probiert:

Code: Alles auswählen

import socket
import time

adresse = "....adresse einer 10MB großen Datei"

timeout = 5
socket.setdefaulttimeout(timeout)

import urllib2

zeit = time.time()
req = urllib2.Request(adresse)
f = urllib2.urlopen(req)
qt = f.read()
f.close()
print time.time() - zeit
Funktioniert leider nicht!
Hab als Beispiel mal eine große Dtaei geladen (dauert 23 Sekunden) und es wird nicht abgebrochen!


Auch mit Multithreading sehe ich kein Erfolg (Thread können ja nicht gekillt werden,oder?)


Hat wer ne idee???

gruß und schöne Weihnachten

Re: Abbruch bei Urllib

Verfasst: Montag 27. Dezember 2010, 00:46
von Sr4l
Quitte hat geschrieben: Ab und zu hängt das Programm einfach! Es gibt keinen Fehler aus, keine Rückgabe oder ähnliches, sonder lädt einfach und macht nichts!
Da müsstest du schon den genauen Code zeigen.
Quitte hat geschrieben: Ich suche also eine Möglichkeit die Anfrage abzubrechen, wenn nach 1 Minute kein Ergebnis vorliegt!
urlopen kennt seit Py2.6 den parameter timeout.

Quitte hat geschrieben: Hab als Beispiel mal eine große Dtaei geladen (dauert 23 Sekunden) und es wird nicht abgebrochen!
Was dauert 23s wenn es nicht abgebrochen wird?

Re: Abbruch bei Urllib

Verfasst: Montag 27. Dezember 2010, 22:43
von Quitte
Da müsstest du schon den genauen Code zeigen.
Genau bei dem Code der da steht, hängt er sich nach etwas 3000 versuchen ab und zu mal auf!

anstatt adresse = ... kannst du ja noch adresse = adres schreiben!
adres ist dann eine Array mit einigen Tausend Adressen


Das Prolem ist, das die Verbindung hergestellt wird, die Übertragungsrate aber gegen 0 läuft!

urlopen kennt seit Py2.6 den parameter timeout.

Ja, meines wissen hat das aber nichts mit meiner Frage zu tun!
Ich möchte Eine Anfrage nach X Sekunden abbrechen!
Timeout hört nach X Sekunden auf zu versuchen die Verbindung herzustellen!
Wenn eine Verbindung hergestellt wird, macht timeout doch nichts mehr, oder???

Kannst du selber ja mal ausprobieren (das Beispiel habe ich oben auch schon gepostet)
import urllib2
import time

adresse = "http://www.gummiseele.de/downloads/python.msi"

zeit = time.time()
f = urllib2.urlopen(adresse,timeout=5)
qt = f.read()
f.close()
print time.time()-zeit

Hier dürfte (wenn timeout das macht was du denkst) ja niemals eine größere Zahl als die 5 gepostet werden!
Bei mir dauert das Script 23 Sekunden!

Was dauert 23s wenn es nicht abgebrochen wird?

Das Beispiel was ich in diesem Beitrag (und im Letzten) gepostet habe!

Re: Abbruch bei Urllib

Verfasst: Montag 27. Dezember 2010, 23:25
von BlackJack
@Quitte: Da werden vielleicht irgendwann Zeitüberschreitungen greifen, die für HTTP definiert sind. Die sind aber in der Regel relativ hoch angesetzt.

Da wirst Du vielleicht auf Prozesse setzen müssen, und die dann nach einer gewissen Zeit selber killen. Schau Dir mal das `multiprocessing`-Modul an.

Re: Abbruch bei Urllib

Verfasst: Dienstag 28. Dezember 2010, 01:31
von Quitte
BlackJack hat geschrieben:Schau Dir mal das `multiprocessing`-Modul an.
Das sieht auf alle Fälle schon mal gut aus!

Immerhin gibt es hier ein kill befehl (bei Treading gibt es den ja nicht)!

Ich probier das mal aus!