SocketServer ThreadingMixIn服务器线程的用途

2024-04-25 13:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在异步(线程)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}$

Tags: 代码org服务器http示例docsserverlibrary
2条回答

在服务器线程示例中,您将启动一个新线程来为内容提供服务。 此线程不是作为deamon(deamon = False)启动的。这意味着程序在server_forever()完成之前不会退出。 所以主线程什么都不做,程序等待非deamon线程关闭。在

  1. 我看到的唯一区别是,这个新线程不是主线程,因此不处理键盘中断或其他主线程所做的事情。在
  2. 如果您想将GUI与服务器集成,这可能会很有用。GUI可以并行运行。在

1)这是一个普遍的问题。当您按CTRL+C组合键时,会向进程发送一个信号。在这个过程中,主线程捕捉到信号,并且(如果处理不当)主线程被中断。但是这个信号不会杀死其他线程。因为Python的线程不安全,所以不会退出。如果您知道自己在做什么,可以添加以下内容:

server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()

现在它应该可以工作了(假设您在server_thread.start()之后做了一些事情,比如等待——否则Python就会退出,它不会等待守护进程线程)。但是请记住,在某些重要操作期间,您可能会杀死服务器。为了避免实现某种优雅的终止:

^{pr2}$

2)它只是在一个单独的线程中启动一个服务器。也许你的想法是你可以同时做其他的手术?如果您只想运行服务器,则不需要这样做。在

原因也可能是我上面说的:优雅的退出。如果你只是中断服务器,它会死掉,也许是在一些重要的操作中。在

相关问题 更多 >