我在尝试了解用于网络通信的套接字时遇到了问题。我创建了一个简单的线程来监听连接并创建用于连接客户端的进程,但我的问题是我无法让线程正确加入,因为我还没有找到取消 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/