Abbruch bei Urllib

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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?
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

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!
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.
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

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!
Antworten