- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在异步(线程)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/
我正在尝试评估各种语言以构建小型高吞吐量应用程序服务器。它需要做一些小事情,比如获取请求、从运行缓存应用程序(memcached、redis)的单独服务器读取数据,以及发回 5 - 10 行 XML
我已经对两个服务器进行了编程,它们基本上使用不同的方法执行相同的操作。两者都是网络服务器,在套接字对象周围有一个非阻塞的 ssl 包装器。线程允许同时处理多个请求。 一个使用 ThreadingTCP
在异步(线程)SocketServer 的例子中http://docs.python.org/2/library/socketserver.html服务器线程(称为 server_thread)启动,
我已在 this post 上阅读此处使用 ThreadingMixin(来自 SocketServer 模块),您可以使用 BaseHTTPServer 创建线程服务器。我试过了,它确实有效。但是,
我正在用 Python 编写多人游戏服务器和客户端,使用内置的 SocketServer 的 TCPServer 和 ThreadingMixIn,因为它似乎比手动管理套接字和线程模块更容易。 (我想
我试图使用基于 SocketServer 的 BaseHttpServer 创建一个 http 代理它有 2 个异步 Mixin(ThreadingMixIn 和 ForkingMixIn) 他们处理
我尝试使用 Python 中的线程 (ThreadingMixIn) 编写 TCPServer。问题是我无法正确关闭它,因为当我再次尝试运行时出现 socket.error: [Errno 48] A
我是一名优秀的程序员,十分优秀!