由于套接字接收回调,线程没有干净地结束

问题描述

我试图在执行关闭处理程序回调时关闭套接字并终止线程(我通过 CTRL+C 发送 SIGINT 信号)

主要

from example import Example

if __name__ == '__main__':

    exmpl = Example()
    success = exmpl.connect('',2000)
    
    if success:
        rospy.on_shutdown(exmpl.shutdown_handler)

        rospy.spin()

导入的类

import socket
import threading

class Example(object):

    def connect(self,host='',port=2000):
        try:
            self.sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
            self.sock.settimeout(10)
            self.sock.bind((host,port))
            self.sock.listen(1)
            self.conn,self.addr = self.sock.accept()
            self.sock.settimeout(None)

            self.t = threading.Thread(target=self.recv_msg)
            self.t.start()

            return True
        
        except Exception as e:
            return False
        
        except Exception as timeout:
            return False

    def recv_msg(self):
        while True:
            recv_msg = self.conn.recv(1024)
            print(recv_msg)

    def shutdown_handler(self):
        try:
            self.sock.close()
            self.t.join()
        except Exception as e:
            print(e)

在这个应用程序中,recv_msg 总是在执行,因为数据一直在到来。因此,当我发送 SIGINT 时,关闭处理程序启动并且只执行语句 sock.close() 而不是 t.join() 并且线程永远不会结束

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)