CherryPy stört das verdrehte Herunterfahren auf Windows

Ich habe eine Anwendung, die Twisted durch den Start des Reaktors mit reactor.run() in meinem Haupt-Thread nach dem Start einige andere Threads, einschließlich der CherryPy Web-Server läuft. Hier ist ein Programm, das heruntergefahren wird, wenn Ctrl + C auf Linux gedrückt wird, aber nicht auf Windows:

 from threading import Thread from signal import signal, SIGINT import cherrypy from twisted.internet import reactor from twisted.web.client import getPage def stop(signum, frame): cherrypy.engine.exit() reactor.callFromThread(reactor.stop) signal(SIGINT, stop) class Root: @cherrypy.expose def index(self): reactor.callFromThread(kickoff) return "Hello World!" cherrypy.server.socket_host = "0.0.0.0" Thread(target=cherrypy.quickstart, args=[Root()]).start() def print_page(html): print(html) def kickoff(): getPage("http://acpstats/account/login").addCallback(print_page) reactor.run() 

Ich glaube, dass CherryPy hier der Schuldige ist, denn hier ist ein anderes Programm, das ich ohne CherryPy geschrieben habe, das bei Linux und Windows bei der Betätigung von Ctrl + C sauber heruntergefahren wird:

 from time import sleep from threading import Thread from signal import signal, SIGINT from twisted.internet import reactor from twisted.web.client import getPage keep_going = True def stop(signum, frame): global keep_going keep_going = False reactor.callFromThread(reactor.stop) signal(SIGINT, stop) def print_page(html): print(html) def kickoff(): getPage("http://acpstats/account/login").addCallback(print_page) def periodic_downloader(): while keep_going: reactor.callFromThread(kickoff) sleep(5) Thread(target=periodic_downloader).start() reactor.run() 

Hat jemand eine Ahnung, was das Problem ist? Hier ist mein Rätsel:

  • Bei Linux funktioniert alles
  • Unter Windows kann ich Funktionen von Signalhandlern mit reactor.callFromThread wenn CherryPy nicht läuft
  • Wenn CherryPy läuft, wird keine Funktion, die ich mit reactor.callFromThread von einem Signalhandler reactor.callFromThread , jemals ausführen (ich habe überprüft, dass der Signalhandler selbst aufgerufen wird)

Was kann ich dagegen tun? Wie kann ich herunterfahren Twisted auf Windows von einem Signal-Handler beim Ausführen von CherryPy? Ist das ein Fehler, oder habe ich einfach einen wichtigen Teil der Dokumentation für eines dieser beiden Projekte verpasst?

One Solution collect form web for “CherryPy stört das verdrehte Herunterfahren auf Windows”

CherryPy behandelt standardmäßig Signale, wenn Sie Quickstart anrufen. In deinem Fall solltest du wohl nur einen Kurzstart auslösen, der nur ein paar Zeilen ist und auswählen und auswählen kannst. Hier ist im Grunde, was Schnellstart im Kofferraum macht:

 if config: cherrypy.config.update(config) tree.mount(root, script_name, config) if hasattr(engine, "signal_handler"): engine.signal_handler.subscribe() if hasattr(engine, "console_control_handler"): engine.console_control_handler.subscribe() engine.start() engine.block() 

In deinem Fall brauchst du nicht die Signalhandler, also kannst du diese auslassen. Du brauchst auch nicht, um Motor zu nennen, wenn du CherryPy nicht aus dem Hauptfaden kommst. Engine.block () ist nur eine Möglichkeit, um den Haupt-Thread nicht sofort beenden, sondern stattdessen warten für die Prozess-Terminierung (das ist so autoreload arbeitet zuverlässig, einige Plattformen haben Probleme rufen execv aus jedem Thread aber der Haupt-Thread).

Wenn du den Block () Anruf lösche, brauchst du nicht mal den Thread () um den Schnellstart. Also, ersetzen Sie Ihre Linie:

 Thread(target=cherrypy.quickstart, args=[Root()]).start() 

mit:

 cherrypy.tree.mount(Root()) cherrypy.engine.start() 
  • Wie ping ein ip und bekomme nur die ms in der Tk mit Python?
  • Bereitstellung von Flask App als Windows Service
  • Machen Sie Unterprozeß finden Sie git ausführbare Datei unter Windows
  • Wie bekomme ich die ganze Ausgabe von meiner .exe mit subprocess und Popen?
  • Die Suche nach einem USB in Python kehrt zurück "es gibt keine Festplatte im Laufwerk"
  • Wie man das Programm in der Python auf Windows verlässt und etwas beim Ausstieg macht
  • Curses-like Bibliothek für Cross-Plattform-Konsole App in Python
  • 'Easy_install -U Cython' scheitert an Beschwerde über vcvarsall.bat und -mno-cygwin
  • Wie kann ich aus einer HTML-Datei in die Zwischenablage in Python in formatiertem Text kopieren?
  • Fehler beim Upgrade von Pip: UnicodeDecodeError: 'utf-8' Codec kann kein Byte decodieren
  • Ein Python-Skript, das das virtualenv aktiviert und dann ein weiteres Python-Skript ausführt?
  • Python ist die beste Programmiersprache der Welt.