我正在编写一个 Python (v3.7.3) 套接字服务器,我想为其使用阻塞 I/O。我使用select()没有超时来接受新客户以及阅读他们的信息。我可以关闭侦听套接字以中止 select(),并捕获 OSError 作为停止执行的指示。
但是,当在单独的线程中运行时,这似乎不起作用,我不明白为什么。
\n\n我知道还有其他方法可以实现此目的,例如使用超时、使用 select() 的虚拟套接字或与侦听器建立虚拟连接以唤醒它。但这些都在某种程度上违背了使用 select() 的目的,并且在单线程中运行时没有必要。
\n\n这是重现该问题的基本示例,在我的实际代码中,仅代表多个线程中的一个(因此,我首先使用线程):
\n\n#!/usr/bin/env python3\n\nimport signal\nimport socket\nimport threading\n\n\nclass SocketCloseTest:\n """Simple test case for using socket.close() to abort select.select()"""\n\n def __init__(self, port, address=None):\n self.port = port\n self.address = address or \'\'\n\n self.socket = None\n\n def stop(self):\n """Close listening socket to stop select.select()"""\n\n if self.socket:\n print("Closing listener", self.socket)\n self.socket.close()\n print("Listener closed", self.socket)\n\n def threaded_run(self):\n """Run test in a separate thread"""\n\n thread = threading.Thread(target=self.run)\n print("Starting …Run Code Online (Sandbox Code Playgroud)