CherryPy会干扰Windows上的Twistedclosures

我有一个应用程序运行Twisted,在启动一些其他线程(包括CherryPy Web服务器reactor.run()在主线程中启动reactor.run()并启动reactor。 这里有一个程序,在Linux上按下Ctrl + C而不是在Windows上时,会干净地closures:

 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() 

我相信CherryPy是这里的罪魁祸首,因为这里有一个不用CherryPy编写的程序,当Ctrl + C被按下时,它在Linux和Windows上干净地closures:

 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() 

有谁知道问题是什么? 这是我的难题:

  • 在Linux上一切正常
  • 在Windows上,当CherryPy不运行时,我可以使用reactor.callFromThread从信号处理程序调用函数
  • 当CherryPy运行时,没有任何函数使用reactor.callFromThread从一个信号处理程序中执行(我已经validation信号处理程序本身是否被调用)

我能做些什么呢? 如何在运行CherryPy时从信号处理程序closuresWindows上的Twisted? 这是一个错误,还是我错过了这两个项目的文档的重要部分?

Solutions Collecting From Web of "CherryPy会干扰Windows上的Twistedclosures"

当您调用快速启动时,CherryPy默认处理信号。 在你的情况下,你应该展开快速入门,这只是几行,然后挑选。 这里基本上是快速启动在干线中的作用:

 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() 

在你的情况下,你不需要信号处理程序,所以你可以省略这些。 如果你没有从主线程启动CherryPy,你也不需要调用engine.block。 Engine.block()只是使主线程不会立即终止的一种方法,而是等待进程终止(这是因为autoreload可以可靠地工作;有些平台在除了主线程之外的任何线程中调用execv的问题)。

如果你删除了block()调用,你甚至不需要快速启动的Thread()。 所以,更换你的线路:

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

有:

 cherrypy.tree.mount(Root()) cherrypy.engine.start()