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
Wie asyncore.loop() gezielt beenden?
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Beobachte doch innerhalb deines Server-Codes das self.serving Event und werfe KeyboardInterrupt.
Bottle: Micro Web Framework + Development Blog
Ich habe das glaube ich etwas ungenau beschrieben.Defnull hat geschrieben:Beobachte doch innerhalb deines Server-Codes das self.serving Event und werfe KeyboardInterrupt.
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.
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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Ich möchte wissen wie man einen asyncore.loop() beenden kann.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.
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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)