小编Pir*_*ish的帖子

无法关闭侦听套接字以从单独的线程中止accept()/select()

我正在编写一个 Python (v3.7.3) 套接字服务器,我想为其使用阻塞 I/O。我使用select()没有超时来接受新客户以及阅读他们的信息。我可以关闭侦听套接字以中止 select(),并捕获 OSError 作为停止执行的指示。

\n\n

但是,当在单独的线程中运行时,这似乎不起作用,我不明白为什么。

\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)

python sockets select multithreading

1
推荐指数
1
解决办法
677
查看次数

标签 统计

multithreading ×1

python ×1

select ×1

sockets ×1