Aufruf einer Funktion abbrechen

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
niklas1993
User
Beiträge: 3
Registriert: Mittwoch 22. Februar 2017, 15:38

Hallo Leute,

Ich habe leider bis jetzt keine Lösung für mein Problem gefunden.
Ich habe folgende try and except Konstallation.

Code: Alles auswählen

try:
variable = Methodenaufruf
except:
print "Methodenaufruf dauert zu lange"
Mein Methodenaufruf dauert nur leider manchmal ewig, bis er ein Ergebniss ausgibt. Wie kann ich dies abfangen?
Sprich den Aufruf nach beispielsweise 10 Sekunden abbrechen.
Da der Aufruf nur sehr lange braucht, aber nicht abbricht, funktioniert meine except Bedingung nicht. Soweit habe ich das Verstanden, aber was kann ich stattdessen machen?

Ich hoffe man versteht was ich meine ;)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kommt sehr auf den Zusammenhang an. Was genau tut die Methode? Hast du sie selbst erstellt? Zeige, wenn möglich, mal den Code der Methode.
niklas1993
User
Beiträge: 3
Registriert: Mittwoch 22. Februar 2017, 15:38

Wollte eigentlich nicht soweit ausholen, aber dann mache ich das jetzt doch mal.

Ich habe einen Raspberry, der kontroliert ob ein Webinterface (vom Receiver) erreichbar ist. Ist dieses erreichbar, so soll er nichts machen. Ist es nicht erreichbar, so soll er den Receiver neustarten (per Funksteckdose).

Dazu habe ich folgenden Code:

Code: Alles auswählen


import mechanize

try:
                        br = mechanize.Browser()
                        br.open("http://192.168.178.34/index_s.html")

except:
                        #Neustart

Leider läuft nun der "open-Aufruf" ewig, ohne Ergebniss, sodass auch die except Bedingung nichts bringt.
Was kann ich stattdessen nutzen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@niklas1993: für die Erreichbarkeit reicht ja ein einfacher PING mit Timeout. Oder falls es den Webserver auch testen soll, ein Socket auf Port 80. mechanize ist da jedenfalls der falsche Weg.
BlackJack

@niklas1993: Sockets kennen Zeitüberschreitungen. Ob und wie man die Zeit mit/bei `mechanize` setzt, kann ich Dir jetzt nicht sagen, aber wie schon gesagt wurde, ist das auch ein bisschen übertrieben. Dafür reicht `urllib2.urlopen()` und das hat ein `timeout`-Argument.
niklas1993
User
Beiträge: 3
Registriert: Mittwoch 22. Februar 2017, 15:38

Danke erstmal für die schnellen Antworten.

Ein einfacher ping reicht leider seltsamer weise nicht aus. Ich kann den Receiver anpingen, aber das Webinterface ist nicht erreichbar.

Mit `urllib2.urlopen()` werde ich mal probieren und mich dann wieder melden.
Antworten