XMLRP Server beenden

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
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Hallo,

ich nutze den XMLRPC Server wie er hier im Forum vorgestellt wurde *. Ich würde ihn gerne so erweitern das er sich auch durch einen xmlrpc-Aufruf beenden lässt.

Sollte dazu trotzdem wie im Beispiel die Option server.serve_forever() verwendet werden ?
Wie kann ich den server am einfachsten eine Nachricht zum beenden senden ?

Hintergrund der Frage ist das sich der Server durch abbrechen mit strg+c manchmal nicht richtig beendet bzw. die Adresse blockiert bleibt. Um das zu umgehen könnte man ja auch die pid ermitteln welche die Adresse belegt und dann das Programm mit kill "pid" beenden was mir aber zu kompliziert erscheint.

Danke für alle Ratschläge

* Beispiel : http://www.python-forum.de/topic-5478.html
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hallo Lufia, ich kenne dein Problem :)
Solange du nur willst das der Server sich mit dem restlichen System beenden lässt kannst du ihn zu Daemon machen: service.setDaemon(True).

Falls du ihn neu starten möchtest wird es etwas komplizierter. Ich habe das jedoch auch schon gelöst und kann es, falls du es brauchen solltest, nachschlagen :)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Hallo veers, danke für die schnelle Antwort.
Ich dachte es gäbe eine ganz simple Möglichkeit den Server durch ein Signal zu beenden und die Adresse freizugeben. Ich habe es mit server.server_close() versucht, was leider keine Auswirkung hatte.

Das mit dem Daemon habe ich nicht ganz verstanden, ich will nicht das gesamte System beenden sondern nur den Server.

Zur Zeit muss ich jedesmal die pid bestimmen und ein kill ausführen was nicht sehr elegant ist. Ich bin mir gerade gar nicht sicher evtl. sollte ich versuchen den Server einfach immer laufen zu lassen. Wenn mein Programm fertig entwickelt ist muss ich den Server ja eigentlich nie beenden, es stört mich vor allem bei der Programmentwicklung. Zudem dachte ich das so eine Funktion einfach dazugehört.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Lufia hat geschrieben:Das mit dem Daemon habe ich nicht ganz verstanden, ich will nicht das gesamte System beenden sondern nur den Server.
Du hast das vermutlich falsch verstanden ich meinte einen Daemon Thread nicht einen Daemon Prozess. Daemon Threnaers haben die Eigenschaft das sie ein beenden das Interpreters nicht verhindern. Und ich nehme mal an dass das ist was du suchst. :)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

serve_forever macht nichts anders als while 1: self.handle() oder sowas. Schau einfach mal im Source nach. Dann einfach das while 1 gegen while self.running austauschen. Dann halt eine Funktion registrieren, die self.running = False macht.
TUFKAB – the user formerly known as blackbird
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

@ Blackbird

Danke, genau soetwas habe ich gesucht. Ich werde mich heute Abend hinsetzten und das ausprobieren.
Ich bin gerade dabei meinem C-Programm direkt XMLRPC beizubringen :? hatte zuvor den Umweg über Pyhton und dann XMLRPC genommen. aber C ist so störrisch :evil:
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

blackbird hat geschrieben:serve_forever macht nichts anders als while 1: self.handle() oder sowas. Schau einfach mal im Source nach. Dann einfach das while 1 gegen while self.running austauschen. Dann halt eine Funktion registrieren, die self.running = False macht.
Das Problem ist das du dann jeweils noch eine Anfrage senden musst da er beim handle() jeweils blockt.

edit: Ist natürlich nur relevant wenn man sich nicht gerade in einer Anfrage befindet oder man die Threaded Variante verwendet. :wink:
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Antworten