2

我正在创建一个 UDP SocketServer,如果我从客户端收到一条关闭消息,我想关闭而不是关闭 UDP 连接。

当我收到消息时,Begin将显示,但Finished不显示。我怎样才能退出这个线程?

class MyUDPHandler( SocketServer.BaseRequestHandler ):       
    def handle( self ):
        data = self.request[0].strip()        
        dic = self.string_XML_to_dic( data )
        if( dic['Cmd'] == str(UDPConst().SHUT_DOWN )): 
            print('Begin')           
            self.server.shutdown()
            print("Finished")

if __name__ == "__main__": 
    HOST, PORT = "", prop['udpport']
    server = SocketServer.UDPServer( ( HOST, PORT ), MyUDPHandler )    
    server.serve_forever()
4

2 回答 2

0

由于您没有在自己的线程中运行服务器(您需要为此继承ThreadingMixIn),因此您不能使用shutdown它,因为它会导致死锁。从中的功能文档注释中:

阻塞直到循环结束。这必须在 serve_forever() 在另一个线程中运行时调用,否则会死锁。

于 2012-02-03T14:12:57.683 回答
0
# Step 1 - Create a global object
global_object = dict()

# Step 2 - Create a function that will receive kill, Control-C signals
def stop_listener(*args): 
   global_object['listener_server'].shutdown()

# Step 3 - Assign kill, and Control-C signal to function=stop_listener
import signal
signal.signal(signal.SIGINT , stop_listener)
signal.signal(signal.SIGTERM, stop_listener)

# Step 4 - Create UDP Server in usual way, and save a reference in global_object
server = socketserver.UDPServer(...)
global_object['listener_server'] = server
server.serve_forever()

解释:

  • 当按下 Control-C 或将 kill 发送到 pid 时 -- function = stop_listener 被调用。
  • function=stop_listener,然后在 UDPServer 引用上调用 shutdown。-
  • 这有助于清除听众。
于 2021-06-08T08:50:04.283 回答