Seite 1 von 1

Wie asyncore.loop() gezielt beenden?

Verfasst: Montag 13. Juli 2009, 09:39
von metty
Hallo zusammen,

ich arbeite momentan an einem kleinen SMTP-Server basierend auf dem Modul smtpd. Dieser wird mit asyncore.loop() gestartet und man kann ihn mit CTRL + C wieder beenden.

Nun möchte ich den Server nicht mit CTRL + C beenden, sondern ihn gezielt über ein Signal (SIGTERM) "herunterfahren". Bei SocketServer kann man dies ja mit einer while-Schleife schaffen, mit asyncore.loop() scheint das so nicht zu funktionieren.

Wie schaffe ich es aus dem asyncore.loop() wieder heraus?
Ich hoffe ihr könnt mir hier helfen.

Vielen Dank und freundliche Grüße

Verfasst: Montag 13. Juli 2009, 10:31
von Defnull
Beobachte doch innerhalb deines Server-Codes das self.serving Event und werfe KeyboardInterrupt.

Verfasst: Montag 13. Juli 2009, 10:44
von metty
Defnull hat geschrieben:Beobachte doch innerhalb deines Server-Codes das self.serving Event und werfe KeyboardInterrupt.
Ich habe das glaube ich etwas ungenau beschrieben.
Mir geht es darum, wie ich einen asyncore.loop() wieder verlassen kann, nicht wie das bei SocketServer funktionieren würde, das war nur ein Beispiel.

Verfasst: Montag 13. Juli 2009, 10:51
von Trundle
Möchtest du jetzt wissen, wie man `asyncore.loop()` beenden kann, oder wie das speziell beim `smtpd`-Modul geht? Prinzipiell beendet sich `asyncore.loop` immer, wenn alle Channels geschlossen sind. Bei `smtpd` könntest du jedoch, wie das auch Defnull bereits gesagt hat, einfach einen `KeyboardInterrupt` werfen, da das `smtpd`-Modul selbigen abfängt.

Verfasst: Montag 13. Juli 2009, 10:53
von metty
Trundle hat geschrieben:Möchtest du jetzt wissen, wie man `asyncore.loop()` beenden kann, oder wie das speziell beim `smtpd`-Modul geht? Prinzipiell beendet sich `asyncore.loop` immer, wenn alle Channels geschlossen sind. Bei `smtpd` könntest du jedoch, wie das auch Defnull bereits gesagt hat, einfach einen `KeyboardInterrupt` werfen, da das `smtpd`-Modul selbigen abfängt.
Ich möchte wissen wie man einen asyncore.loop() beenden kann.

Verfasst: Dienstag 14. Juli 2009, 06:33
von Trundle
Dann musst du entweder alle alle Channels/Dispatcher/wieduesnennenmagst schließen, so dass `asyncore.loop()` von alleine aufhört (bzw. die map leeren oder so) oder du machst es eben einfach wie smtpd und wirfst eine Ausnahme, die du dann abfängst. Oder aber du ersetzt `asyncore.loop()` durch eine eigene Schleife, in der du entweder direkt `asyncore.poll()` (oder `asyncore.poll2()`) aufrufst bzw. `asyncore.loop()` und ein ``count``-Argument übergibst, dann kannst du ja selber eine Abbruchbedingung bestimmen.