我有一个应用程序运行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? 这是一个错误,还是我错过了这两个项目的文档的重要部分?
强制python使用旧版本的模块(比我现在安装的)
Python / Twisted程序在Windows下validationSSL证书的正确方法是什么?
python-twisted和SIGKILL
安装扭曲在Python中失败,'没有这样的文件'
Pip不会在Windows上安装Twisted
我怎样才能在python中使用pseudoterminal来模拟一个串行端口?
python执行远程程序
win32api.dll不会安装
连接到(有时是虚拟化的)Windows计算机上运行的服务器时出现的问题
无法在Windows机器上安装扭曲的包
当您调用快速启动时,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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。