Threading - Zeitbeschränkung

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
dnaxx
User
Beiträge: 6
Registriert: Montag 15. August 2005, 09:52

Montag 15. August 2005, 09:58

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.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Montag 15. August 2005, 11:47

Du könntest einen weiteren Thread machen, der nach einer bestimmten Zeit, die Verbliebenen Threads beendet.

Wenn du mit Sockets arbeitest, dann kannst du mit Select oder Poll arbeiten, die haben Timeouts. Es kann sein, dass Poll auch mit der urllib funktioniert, aber das ist reine spekulation.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 15. August 2005, 20:27

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 Modvoice
dnaxx
User
Beiträge: 6
Registriert: Montag 15. August 2005, 09:52

Dienstag 16. August 2005, 15:03

vorübergehend habe ich jetzt einfach mal für jeden thread ein time-out gesetzt. mal schauen wie es sich bewährt.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 29. August 2005, 13:22

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:

Code: Alles auswählen

import urllib, socket

socket.setdefaulttimeout(1)
try:
    urllib.urlopen("http://blabla.de")
except IOError, e:
  # handle timeout
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 :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 29. August 2005, 14:27

OK, ich hab mal einen Rohbau mit einem Thread gemacht:

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"
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???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 29. August 2005, 14:36

offtopic: Wäre es vielleicht eine Idee das als Featurerequest für urllib zu formulieren?

Gruß,
Christian
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 29. August 2005, 14:38

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:

Code: Alles auswählen

urllib.urlopen( "http://blabla.de", timeout=2 )

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 29. August 2005, 14:52

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 29. August 2005, 16:51

Hab's mal im Wiki in die PythonWunschliste Aufgenommen.


Aber zurück zu meiner Lösung... Weiß niemand wie ich es damit realisieren kann???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 4. September 2005, 09:51

Kannst ja für Python 2.2 setDefaultSocketTimeout nachrüsten.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 4. September 2005, 12:51

Leonidas hat geschrieben:Kannst ja für Python 2.2 setDefaultSocketTimeout nachrüsten.
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 rum

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten