Wie mache ich einen Python Windows Service eines flask / gevent.socketio Servers?

8

Ich habe einen flask / gevent SocketIOServer und muss es als Dienst funktionieren lassen:

%Vor%

Allerdings kann ich nicht herausfinden, wie es von SvcStop gestoppt wird, und das Ausführen hat das seltsame Verhalten, dass das Service-Parsing von Befehlszeilenparametern NACH dem Beenden des Runservers erfolgte. Dies bedeutet, dass der Flashin Server ausgeführt wird. Ich kann vom Webbrowser aus zugreifen, der Service Manager hat ihn jedoch als "Nicht gestartet" aufgeführt. Zum Beispiel läuft in der Befehlszeile:

%Vor%

Mit dem Vorschlag, den Live-Reloader zu entfernen, ist dies der verbleibende Code. Trotzdem, das gleiche Problem

def SvcDoRun (selbst):     servicemanager.LogMsg (Servicemanager.EVENTLOG_INFORMATION_TYPE, Servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, ''))

%Vor%     
mamcx 13.02.2013, 21:22
quelle

3 Antworten

1

Um es von SvcStop zu stoppen, müssen Sie einen Verweis auf "ws" in einer globalen Variablen speichern (das heißt, irgendwo, wo es später abgerufen werden kann). AFAIK "ws.kill ()" sollte dann die Schleife beenden.

Der run_with_loader-Decorator scheint die dekorierte Funktion sofort auszuführen, was erklären würde, warum die Befehlszeile nach der Ausführung des Webservers verarbeitet wird. Brauchen Sie ein automatisches Nachladen, erscheint der Decorator nur dann, wenn Sie neu geladen werden müssen.

UPDATE: Beispielcode hinzugefügt

In einem Projekt, das keine Flasche oder Gevent verwendet, benutze ich etwas ähnliches (mit vielen Details entfernt):

%Vor%     
Ronald Oussoren 26.02.2013 15:37
quelle
0

Die Methode serve_forever stammt von BaseServer.serve_forever . Um es zu stoppen, müssen Sie BaseServer.shutdown() oder eine Ableitung davon aufrufen.

Kurz gesagt, Sie müssen ws im globalen Gültigkeitsbereich deklarieren. Wenn Sie diesen Code vor Ihre Service -Klassendefinition stellen, können Sie dies tun.

%Vor%

Ändern Sie dann Ihre Service.SvcStop -Implementierung zu dieser:

%Vor%

Da ws.shutdown() bereits darauf wartet, dass der Listener stoppt, können Sie self.hWaitStop loswerden, es sei denn, Sie verwenden es woanders in Ihrem Code.

Erfordert Python 2.6 +

    
ixe013 27.02.2013 21:12
quelle
0

Ich kann nicht auf WSGIRequestHandler in Flask außerhalb von request zugreifen, also verwende ich Process .

%Vor%     
Steely Wing 05.08.2014 02:57
quelle