run Methode nach serve_forever aufrufen
Hallo, ich habe folgendes Problem. Ein Programm startet einen XML-RPC Server. Dieser bietet eine Methode run() an, die den eigentlichen Ablauf startet. Im Code schaut das so aus: server = ControlServer(config, w_stack) ControlServer startet einen ThreadedXMLRPCServer, abgeleitet von ThreadingMixIn und SimpleXMLRPCServer. In ControlServer.__init__: self.server.serve_forever() Nun würde ich das Programm auch gerne standalone laufen lassen, der Vorgang soll also gestartet werden, ohne das die run() Methode von extern aufgerufen werden muss, das Programm soll sie selber aufrufen. serve_forever() blockiert allerdings den Programmfluss. Eine Möglichkeit wäre sicherlich, dass ich vor dem Aufruf von serve_forever() einen seperaten Thread starte und in diesen dann run() aufrufe. Dies erscheint mir allerdings recht umständlich. Wie würdet ihr das machen? Also einfach nach den Aufruf von serve_forever() noch eine einzelne Methode der Klasse aufrufen? Danke & Grüße, Florian
Florian Lindner wrote:
Hallo,
ich habe folgendes Problem. Ein Programm startet einen XML-RPC Server. Dieser bietet eine Methode run() an, die den eigentlichen Ablauf startet. Im Code schaut das so aus:
server = ControlServer(config, w_stack)
ControlServer startet einen ThreadedXMLRPCServer, abgeleitet von ThreadingMixIn und SimpleXMLRPCServer.
In ControlServer.__init__: self.server.serve_forever()
Nun würde ich das Programm auch gerne standalone laufen lassen, der Vorgang soll also gestartet werden, ohne das die run() Methode von extern aufgerufen werden muss, das Programm soll sie selber aufrufen. serve_forever() blockiert allerdings den Programmfluss.
Eine Möglichkeit wäre sicherlich, dass ich vor dem Aufruf von serve_forever() einen seperaten Thread starte und in diesen dann run() aufrufe. Dies erscheint mir allerdings recht umständlich.
Wie würdet ihr das machen? Also einfach nach den Aufruf von serve_forever() noch eine einzelne Methode der Klasse aufrufen?
Einfach den serve_forever()-call aus ControlServer.__init__() entfernen und ggf. explizit aufrufen? Hm, wahrscheinlich hab ich die Frage nicht verstanden...
On 11.10.2011 17:23, Florian Lindner wrote:
Eine Möglichkeit wäre sicherlich, dass ich vor dem Aufruf von serve_forever() einen seperaten Thread starte und in diesen dann run() aufrufe. Dies erscheint mir allerdings recht umständlich.
'serve_forever' startet eine Eventschleife, die nicht wieder verlassen wird und die ganze Zeit laufen muss, damit der Server funktioniert. Wenn dein Programm parallel noch etwas machen soll, hast du im Prinzip vier Möglichkeiten: 1) 'serve_forever' läuft in einem extra-Thread. 2) 'server_forever' läuft in einem anderen Prozess ('multiprocssing') 3) Dein Programm wird aus der Eventschleife von 'serve_forever' aufgerufen. Dazu musst du natürlich callback-Funktionen definieren und dafür sorgen, das diese (bei bestimmten Events) aufgerufen werden. 4) Du progarmmierst eine eigene Eventschleife, die die Aufgaben von 'serve_forever' übernimmt und die Aufgaben deines eigenen Programms mit erledigt. Dann kannst du auch darüber nachdenken, ob der Server einen polling-Mechanismus verwendet, oder mit 'select' arbeitet. Im Falle 1) und 2) musst du dir noch einen Mechanismuss üebrlegen, wie Daten vom Serverthread/prozess in dein Hauptprogramm kommen. Sieh dir dazu das Modul 'Queue' an. Das mag dir umständlich erscheinen, liegt aber in der Natur der Sache. (Pseudo-)Parallele Ausführung von Code ist immer etwas aufwendiger. Chris
participants (3)
-
Christopher Arndt
-
Florian Lindner
-
Peter Otten