在Python中中断Select以添加另一个待监视的套接字
我正在为一个Windows XP的应用程序实现点对点的进程间通信,使用的是TCP协议。
我在用Python 2.6.6的select
和socket
模块。
我有三个TCP线程:一个是读取线程,通常在select()
上阻塞,另一个是写入线程,通常在等待一个事件(这个事件表示有东西要写入TCP),还有一个是监听线程,负责接受连接。
如果我启动一个新连接或者关闭一个当前的连接,我就需要中断读取的select,然后重新启动它,以便它也能监听新接受的socket。
在WSACancelBlockingCall
,这样可以优雅地中断select。
所以我的问题是:有没有办法用Python的方式做到这一切,而不需要使用poll()
?
非常感谢
--DM
2 个回答
1
我不能添加评论,所以我把这个当作回答来写。
不要使用 WSACancelBlockingCall
。你应该参考 Adam Rosenfield 的 回答。你可以创建一对虚拟的套接字,让它们互相连接,而不是使用虚拟的文件描述符。然后把其中一个套接字放入你的 select()
调用中。当你需要中断这个调用时,只需向第二个虚拟套接字写入一个字节。
哦,别忘了在 select()
返回时,从第一个套接字中读取那个字节。
8
你可以试着在你使用的文件描述符集合中添加一个额外的文件描述符,用来作为信号机制。然后你可以往这个描述符写一个虚假的值,这样就能让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')