Wie asyncore.loop() gezielt beenden?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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
Zuletzt geändert von metty am Montag 13. Juli 2009, 10:44, insgesamt 3-mal geändert.
Benutzeravatar
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
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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)
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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)
Antworten