python - 在python线程中关闭监听套接字

标签 python multithreading sockets

我在尝试了解用于网络通信的套接字时遇到了问题。我创建了一个简单的线程来监听连接并创建用于连接客户端的进程,但我的问题是我无法让线程正确加入,因为我还没有找到取消 socket.accept() 调用的方法当我想退出程序时。

我的代码是这样的;

class ServerThread( threading.Thread ):

    def __init__(self, queue, host, port):
        threading.Thread.__init__(self)
        self.queue = queue
        self.running = True
        self.hostname = host
        self.port = port

    def run(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind((self.hostname, self.port))
        self.socket.listen(1)
        while self.running:
            try:
                conn, address = self.socket.accept()
                process = Process(target=server_slave, args=(conn, address, self.queue))
                process.daemon = True
                process.start()
            except socket.timeout:
                pass

    def stop(self):
        self.running = False
        self.socket.close()

我设法通过设置 self.setDaemon(True) 并退出主程序来关闭程序,将所有内容交给伟大的垃圾收集器 - 但这似乎是一个糟糕的解决方案。我也尝试过为套接字设置超时,但这会导致 [Errno 35] Resource temporary unavailable(无论实际超时如何,即使我将其设置为年...)。

我做错了什么?我是否以愚蠢的方式设计了线程,或者我是否遗漏了有关接受连接的内容?

最佳答案

让线程关闭的一种方法似乎是与套接字建立连接,从而使线程继续完成。

def stop(self):
    self.running = False
    socket.socket(socket.AF_INET, 
                  socket.SOCK_STREAM).connect( (self.hostname, self.port))
    self.socket.close()

这可行,但仍然感觉它可能不是最优的......

关于python - 在python线程中关闭监听套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734534/

相关文章:

python - 从具有相关字段的 django ORM 检索查询

c - ICMP header 和 IP header 校验和计算

c++ - 在特定情况下不发送 UDP 广播

python - 带有用于自定义作业的附加线程的 CherryPy

python - CSV 写行数据

python - 将信息从 python 传递到 c prog

java - 在 "Java Concurrency In Practice"之后阅读更多并发示例?

c++ - 我的代码中存在死锁/访问冲突,即使我已经相互排除它

c++ - 运行英特尔线程构建模块的 XCode 8 环境变量是什么

Java - 关闭UDP套接字