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() 
  • Bearbeiten von Windows-Registry, von Python, unter Linux
  • Richten Sie Python unter Windows ein, um python in cmd nicht anzugeben
  • Versuche, eine Webseite mit Selen in Python zu starten
  • Überprüfen Sie den Status des Prozesses und starten Sie den Prozess neu, wenn nicht reagiert / gestoppt - Python
  • Planen eines regelmäßigen Ereignisses: Cron / Cron Alternativen (einschließlich Sellerie)
  • So zeigen Sie Text auf dem Bildschirm ohne ein Fenster mit Python
  • OpenOffice.org Entwicklung mit pyUno ​​für Windows - welche Python?
  • Setzen Sie die SPARK-HOME-Pfadvariable in Windows und Pycharm ein
  • Halten Sie mehrere Konsolenfenster geöffnet von Batch
  • Multiprocessing in der IPython-Konsole auf der Windows-Maschine - wenn __name_-Anforderung
  • Pythonbindungen für VLC
  • Python ist die beste Programmiersprache der Welt.