- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对如何正确关闭我正在使用的非常简单的服务器感到困惑。
我在想这应该够了:
#!/usr/bin/python
import signal
import myhandler
import SocketServer
def terminate(signal, frame):
print "terminating on %s at %s"
server.shutdown()
if __name__ == "__main__":
signal.signal(signal.SIGTERM, terminate)
server = SocketServer.TCPServer(("localhost", 9999), myhandler.MyHandler)
server.serve_forever()
服务器工作正常,但是当我向它发送 SIGTERM 时,它只打印 terminating on 15 at ...
但并没有真正关闭(即关闭所有套接字并退出)。
现在pydoc解释了
shutdown(self)
Stops the serve_forever loop.
Blocks until the loop has finished. This must be called while
serve_forever() is running in another thread, or it will
deadlock.
但这就是我迷路的地方,因为我什至几乎没有开始思考线程编程。现在我只需要一个简单的 TCP 回显服务器,我可以 killall
并随时开始(由于剩余的 LISTENING 套接字,现在失败了)。
那么实现这一目标的正确方法是什么?
最佳答案
免责声明:我有 0、nil、null、none,没有使用 python 的经验。免责声明 2:我绝不认为您的服务器是“必经之路”,涉及到...与服务器相关的任何事物,即使是最基本的事物或学校作业以外的任何事物东西;它可能是帮助人们学习基础知识的一个不错的样本,但与此同时,它在很多层面上都具有误导性和错误性,我数不清了。
回到你的问题。我获取了您的代码并对其进行了修改以使其按预期工作:
#!/usr/bin/python
import signal
import SocketServer
import threading
import thread
class DummyServer(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
self.request.send(data)
return
def shutdownHandler(msg,evt):
print "shutdown handler called. shutting down on thread id:%x"%(id(threading.currentThread()))
server.shutdown()
print "shutdown complete"
evt.set()
return
def terminate(signal,frame):
print "terminate handle on thread id:%x"%(id(threading.currentThread()))
t = threading.Thread(target = shutdownHandler,args = ('SIGTERM received',doneEvent))
t.start()
if __name__ == "__main__":
doneEvent = threading.Event()
print "main thread id:%x"%(id(threading.currentThread()))
signal.signal(signal.SIGTERM, terminate)
server = SocketServer.TCPServer(("localhost",9999), DummyServer)
server.serve_forever()
doneEvent.wait()
您应该检查 SocketServer 的代码,尤其是 server_forever() 和 shutdown() 方法。您还应该尝试了解线程以及如何在它们之间进行任何类型的通信/信号发送。有很多关于这些主题的好资源。
关于线程要记住的基本事情是,一般来说,一个线程一次只能做一件事——你的信号处理程序就是其中之一 :) 如果一个线程卡在 server_forever() 中,你可以'不要期望同一个线程也能够运行对 shutdown() 的调用。 Python(检查信号文档)将在主线程上运行您的信号处理程序 - 与从您的代码运行 server_forever() 循环的主线程相同:从信号处理程序中调用 shutdown() 将导致死锁,正如您所注意到的。
解决方法是创建一个新线程,其唯一目的是运行 shutdown()。新线程的 shutdown() 调用将向主线程的 server_forever() 发出信号,表明是时候中断循环并退出了。主线程甚至可能在运行 shutdown() 的线程完成之前结束 - 一般来说,当主线程结束时,任何其他线程也会突然被杀死,而没有机会完成它们正在做的事情。
doneEvent 甚至用于确保主线程将等待 (doneEvent.wait()) 直到关闭线程完成它的工作 - 在退出之前打印“关闭完成”。
关于python - 关闭 SIG* 上的 SocketServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17550389/
我正在尝试学习 Java 网络编程,但遇到了一些障碍。我已经编写了服务器和客户端,但每次尝试连接它们时,我都会立即收到连接关闭错误。然后,我尝试编辑它,但现在出现连接拒绝错误。放弃了这一点,我决定在一
scala.tools.util.SocketServer 的用途是什么? 最佳答案 它是编译器的一部分,而不是标准 scala 库的一部分。其目的是实现fsc 的服务器通信。 (快速 Scala 编
我正在使用 SocketServer 启动一个简单的 TCP 服务器: class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServe
因此,我找到了以下示例代码,该示例代码允许在给定的URL和端口处建立基本的python HTTP服务器。我对Web服务器缺乏经验,并且正在尝试为此服务器的某些GET请求创建处理程序。但是,当远程访问此
我正在尝试制作Java套接字服务器,它有框架,可以在其中显示消息。 但是当我从框架构造函数运行服务器时,框架不可见。 我的代码的一部分: 调用框架: public static void ma
我在Python中使用TCP服务器,它实现了这个类: class ThreadedTCPServer(SocketServer.ThreadingTCPServer): pass 它的正常使用
抱歉,如果这个问题太基础了 - 这是我第一次尝试在 Python 中使用多线程套接字。 基本上,我正在尝试编写代码来获取 UDPServer 套接字接收的数据;套接字本身在线程内运行。 为了使主线程可
我在应用程序中使用客户端-服务器机制来传输内部数据。服务器部件之一应设计为一次服务一个请求,没有线程,没有积压。我发现奇怪的功能然后使用: serverport = new ServerSocket(
我想在我的 mac 上创建一个 SocketServer。 然而,这似乎是软件包的一些问题。当我尝试这个采样代码时发现 here它引发了属性错误。 import SocketServer class
我一直在四处寻找一种方法来让 SocketServer python 模块在没有成功的情况下监听多播。 有人成功做到了吗? 任何见解将不胜感激! 谢谢 最佳答案 文档 (http://docs.pyt
我正在使用 Python3 的 socketserver 模块创建一个简单的 TCP 服务器。我想获取服务器所服务的服务器的 IP。 我注意到 socketserver(而不是 BaseServer)
我正在尝试实现 SocketServer 以从移动应用程序接收文件: 移动应用程序发送文件大小。 移动应用程序发送文件。 正确接收文件大小。在应用程序中发送所有数据。但是,SocketServer无法
我需要用socketserver搭建一个tcp server。根据他们的文档,我需要继承类 TCPServer,并将它传递给类 BaseRequestHandler 的子类,我重写了方法 handle
下面是我目前使用的代码: #! /usr/bin/python print 'Content-type: application' print '\n\n' import SocketServer i
我是java新手,我无法理解void go()方法的while循环部分。accept()方法等待客户端请求连接到服务器,那么为什么像Print writer等其他语句,没有被执行? 其他语句是否在 w
我只是用 Sockets 和 ServerSockets 进行了一些测试。所以我做了一个小测试程序,但它不起作用。看起来它停在“.accept()”方法的某个地方,但我不知道为什么。有人可以帮忙吗?
我有一个 Android 服务在后台运行,它将使用以下代码: while(true) { ServerSocket server = new ServerSocket(1234); Socke
这是我玩过的代码,但每次我犯错我都无法重新启动它。它对我说端口/套接字已被使用这是第一个问题第二个在我的 MyTCPHandler 中,我怎么知道使用的端口?这是我的代码: # MetaProject
我正在创建一个 UDP SocketServer,如果我收到来自客户端的关闭消息,我想关闭而不是关闭 UDP 连接。 当我收到消息时,将显示 Begin,但不会显示 Finished。我怎样才能退出这
我正在使用 Python 3.1 中的 socketserver 模块运行 Python 服务器。每次我从客户端(客户端成功)获得连接时,我的服务器都会收到一个错误。这是我的代码: import so
我是一名优秀的程序员,十分优秀!