中断 Select 以添加另一个要在 Python 中监视的套接字

发布于 2024-10-11 15:11:34 字数 453 浏览 4 评论 0原文

我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC。

我在 Python 2.6.6 中使用 selectsocket 模块。

我有三个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

通知家属抬走 2024-10-18 15:11:34

您可以尝试向您的集合中添加一个额外的文件描述符,用作信号机制。然后,您可以向该描述符写入一个虚拟值以导致 select 退出。例如:

my_pipe = os.pipe()
...
while True:
    ready_fds = select.select(my_read_fds + [my_pipe[0]],
                              my_write_fds, my_except_fds, timeout)
    if my_pipe[0] in ready_fds[0]:
        # Add another fd to my_read_fds, etc.
        os.read(my_pipe[0], 1)
    ...

# To interrupt the current select call and add a new fd, write to the pipe:
os.write(my_pipe[1], 'x')

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:

my_pipe = os.pipe()
...
while True:
    ready_fds = select.select(my_read_fds + [my_pipe[0]],
                              my_write_fds, my_except_fds, timeout)
    if my_pipe[0] in ready_fds[0]:
        # Add another fd to my_read_fds, etc.
        os.read(my_pipe[0], 1)
    ...

# To interrupt the current select call and add a new fd, write to the pipe:
os.write(my_pipe[1], 'x')
ˉ厌 2024-10-18 15:11:34

我无法添加评论,因此我将其添加为答案。

不要使用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 your select() 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文