Hallo,
Ich schreibe gerade ein kleines Tool, welches mehrere XML-Files paralell von verschiedenen Quellen herunterladet.
Jede Quelle hat einen eigenen Thread in welchem das Dokument heruntergeladen wird. Manche Seiten sind enorm langsam und "blockieren" somit quasi das Skript.
Daher würde ich gerne die maximale Laufzeit pro Thread definieren können. Geht das irgendwie?
lG.
Threading - Zeitbeschränkung
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Oder du kommst irgendwie an das socket von urllib ran, ich könnte mir denken, das das unschwer zu erreichen ist, dann kannst du direkt das Timeout setzen. Oder du kannst die Sockets auf nicht-blockierend stellen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab mit meinem RSS Modul das selbe Problem... Ist der Server nicht erreichbar, dauert es eine Ewigkeit, bis man mal eine Rückmeldung bekommt, weil urllib blockiert
Gibt's dafür eine einfache Lösung? Leonidas ansatz finde ich vernüpftig, aber wie würde das gehen?
Edit1:
Hier hab ich was gefunden:
http://www.steffensiebert.de/soft/pytho ... tsocket.py
Aber eine kleine Lösung ist das nicht
Edit2:
Geht doch viel einfacher:
Edit3: Mist, socket.setdefaulttimeout() geht erst ab Python 2.3, auf dem Server hab ich leider erst Python v2.2.x 
Also muß ich mir da doch ein Timeout selber basteln

Edit1:
Hier hab ich was gefunden:
http://www.steffensiebert.de/soft/pytho ... tsocket.py
Aber eine kleine Lösung ist das nicht

Edit2:
Geht doch viel einfacher:
Code: Alles auswählen
import urllib, socket
socket.setdefaulttimeout(1)
try:
urllib.urlopen("http://blabla.de")
except IOError, e:
# handle timeout

Also muß ich mir da doch ein Timeout selber basteln

- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
OK, ich hab mal einen Rohbau mit einem Thread gemacht:
Aber ich weiß nicht, wie ich die urllib-Abfrage bei stop() beenden soll... Kann man das garnicht???
Muß ich das ganze per subprocess() und os.kill() machen???
Code: Alles auswählen
import urllib, threading
class urlopen(threading.Thread):
"""
Allgemeine Klasse um urllib mit einem Timeout zu vesehen.
"""
def __init__( self, url, timeout ):
self.url = url
threading.Thread.__init__(self)
self.start()
self.join( timeout )
self.stop()
def run(self):
self.u = urllib.urlopen( self.url )
def stop( self ):
print "soll gestoppt werden..."
print "Starte..."
page = urlopen( "http://192.168.0.0", 1 )
print "OK"
Muß ich das ganze per subprocess() und os.kill() machen???
offtopic: Wäre es vielleicht eine Idee das als Featurerequest für urllib zu formulieren?
Gruß,
Christian
Gruß,
Christian
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Naja, ab Python 2.3 ist es ja mit dem setzten von socket.setdefaulttimeout() getan...
Schön wäre aber sicherlich eine einfachere Methode wie:
Schön wäre aber sicherlich eine einfachere Methode wie:
Code: Alles auswählen
urllib.urlopen( "http://blabla.de", timeout=2 )
Genau das meine ich - wir genießen doch alle den Luxus, daß bei Python die Batterien mit drin sind. Also warum nicht auch hier?
Wenn jemand so ein Featurerequest schreiben möchte und ggf. Übersetzungshilfe oder so braucht, biete ich gerne meine Hilfe an.
Gruß,
Christian
Wenn jemand so ein Featurerequest schreiben möchte und ggf. Übersetzungshilfe oder so braucht, biete ich gerne meine Hilfe an.
Gruß,
Christian
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab's mal im Wiki in die PythonWunschliste Aufgenommen.
Aber zurück zu meiner Lösung... Weiß niemand wie ich es damit realisieren kann???
Aber zurück zu meiner Lösung... Weiß niemand wie ich es damit realisieren kann???
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kannst ja für Python 2.2 setDefaultSocketTimeout nachrüsten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das Skript hab ich auch achon gefunden... Ich dachte nur, das ich evtl. ohne dem auskommen könnte... Anscheinend kann man aber keine laufenden Threads abbrechen, von daher kommt ich wohl doch nicht drum rumLeonidas hat geschrieben:Kannst ja für Python 2.2 setDefaultSocketTimeout nachrüsten.