在异步(线程)SocketServer http://docs.python.org/2/library/socketserver.html的示例中,启动一个服务器线程(称为server_thread),为每个请求启动新线程。由于在捕捉键盘中断时遇到一些问题,我开始寻找类似的代码,发现不使用服务器线程时没有明显的区别,但ctrl-c实际上可以工作。在
即使我的代码能用,我还是很想知道
1)当使用服务器线程时,为什么一个简单的“尝试”捕捉键盘中断不起作用?在
2)示例中的服务器线程有什么好处-与我的简单示例相反?在
在python SocketServer示例中,在try中捕捉键盘中断不起作用:
if __name__ == "__main__":
server = ThreadedTCPServer(serverAddr, SomeCode)
<snip>
# Start a thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()
我的简单示例是ctrl-c。在
^{pr2}$
在服务器线程示例中,您将启动一个新线程来为内容提供服务。 此线程不是作为deamon(
deamon = False
)启动的。这意味着程序在server_forever()
完成之前不会退出。 所以主线程什么都不做,程序等待非deamon线程关闭。在1)这是一个普遍的问题。当您按CTRL+C组合键时,会向进程发送一个信号。在这个过程中,主线程捕捉到信号,并且(如果处理不当)主线程被中断。但是这个信号不会杀死其他线程。因为Python的线程不安全,所以不会退出。如果您知道自己在做什么,可以添加以下内容:
现在它应该可以工作了(假设您在
^{pr2}$server_thread.start()
之后做了一些事情,比如等待——否则Python就会退出,它不会等待守护进程线程)。但是请记住,在某些重要操作期间,您可能会杀死服务器。为了避免实现某种优雅的终止:2)它只是在一个单独的线程中启动一个服务器。也许你的想法是你可以同时做其他的手术?如果您只想运行服务器,则不需要这样做。在
原因也可能是我上面说的:优雅的退出。如果你只是中断服务器,它会死掉,也许是在一些重要的操作中。在
相关问题 更多 >
编程相关推荐