中断 Select 以添加另一个要在 Python 中监视的套接字
我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC。
我在 Python 2.6.6 中使用 select
和 socket
模块。
我有三个 TCP 线程,一个读取线程通常在 select()
上阻塞,一个写入线程通常等待一个事件(该事件表明有东西要写入 TCP),还有一个监听线程接受连接的线程。
如果我启动一个新连接或关闭当前连接,那么我需要中断读取选择并重新启动它,以便它也侦听新接受的套接字。
在 winsock
下,我可以调用 WSACancelBlockingCall
这将优雅地中断选择。
所以我的问题是:是否有可能以 pythonic 方式完成所有这一切,而无需求助于使用 poll() ?
非常感谢
--DM
I'm implementing peer-to-peer IPC using TCP in a Windows XP application.
I'm using the select
and socket
modules in Python 2.6.6.
I have three TCP threads, a reading thread that typically is blocking on select()
, a writing thread that is typically waiting on an event (the event indicates there is stuff to write to TCP) and a listening thread that accepts connections.
If I start a new connection or close a current one then I need to interrupt the read select and restart it so it listens to the newly accepted socket as well.
Under winsock
I can call WSACancelBlockingCall
which will interrupt the select gracefully.
So my question is this: is it possible to do all this in a pythonic way without resorting to using poll()
?
Many thx
--DM
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以尝试向您的集合中添加一个额外的文件描述符,用作信号机制。然后,您可以向该描述符写入一个虚拟值以导致
select
退出。例如:You could try adding an extra file descriptor to your set that you use as a signaling mechanism. You can then write to that descriptor a dummy value to cause
select
to exit. For example:我无法添加评论,因此我将其添加为答案。
不要使用
WSACancelBlockingCall
。您应该使用 Adam Rosenfield 的 的方法回答。只需制作一对连接到另一个的虚拟套接字,而不是虚拟文件描述符。在您的select()
调用中包含该套接字之一。当您需要中断呼叫时 - 只需将一个字节写入第二个虚拟套接字即可。哦,别忘了当
select()
返回时从第一个套接字读回该字节。I am not able to add comments, so I'm adding this as an answer.
Don't use
WSACancelBlockingCall
. You should use the approach from Adam Rosenfield's answer. Just make a pair of dummy sockets one connected to another, instead of a dummy file descriptor. Include one of that sockets in yourselect()
call. When you need to interrupt the call - just write a byte into the second dummy socket.Oh, and don't forget to read that byte back from the first socket when
select()
will return.