【发布时间】:2013-05-20 00:42:11
【问题描述】:
我在尝试了解用于网络通信的套接字时遇到问题。我制作了一个简单的线程来监听连接并为连接客户端创建进程,但我的问题是我无法让线程正确加入,因为我还没有找到取消 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 temporarily unavailable(不管实际超时,即使我将它设置为年......)。
我做错了什么?我是否以愚蠢的方式设计了线程,或者我错过了接受连接的一些内容?
【问题讨论】:
-
'但这似乎是一个糟糕的解决方案' - 它有效吗?如果您不喜欢让操作系统终止所有线程,您可以尝试从主线程或其他线程关闭侦听套接字。这通常会导致 accept() 'early' 返回错误。适用于大多数操作系统/语言,但未尝试使用 Python,因此不是答案。
-
它有效 - 但我觉得这样做可能不会很好地对待潜在客户。我发布了一个看起来更好的解决方案,因为它允许代码完成,但它仍然看起来有点奇怪,因为它以创建一个我必须立即加入的新进程结束。
标签: python multithreading sockets