gpt4 book ai didi

python - SocketServer ThreadingMixIn server_thread 的用途

转载 作者:太空狗 更新时间:2023-10-30 02:46:04 26 4
gpt4 key购买 nike

在异步(线程)SocketServer 的例子中http://docs.python.org/2/library/socketserver.html服务器线程(称为 server_thread)启动,为每个请求启动新线程。由于捕捉 KeyboardInterrupts 的一些问题,我开始寻找类似的代码,发现当不使用服务器线程时没有明显的区别,但 ctrl-c 确实有效。

即使我的代码有效,我也非常想知道

1) 为什么在使用 server_thread 时简单的“尝试”捕获 KeyboardInterrupt 不起作用?

2) 示例中的 server_thread 有什么用 - 与我的稍微简单的示例相反?

从 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 有效。

if __name__ == "__main__":
server = ThreadedTCPServer(serverAddr, SomeCode)
try:
server.serve_forever()
print "ctrl-c to exit"
except KeyboardInterrupt:
print "interrupt received, exiting"
server.shutdown()

最佳答案

1) 这是一个普遍的问题。当您执行 CTRL+C 时,会向进程发送一个信号。在此过程中,主线程捕获信号并且(如果处理不当)主线程被中断。但该信号不会杀死其他线程。只要有非守护线程在运行,Python 就不会退出(因为那样不安全)。如果您知道自己在做什么,可以添加以下内容:

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

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

import signal

if __name__ == "__main__":
server = ThreadedTCPServer(serverAddr, SomeCode)

# some code
server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()
# some code

try:
signal.pause() # wait for a signal, perhaps in a loop?
except:
server.shutdown() # graceful quit

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

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

关于python - SocketServer ThreadingMixIn server_thread 的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22192120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com