我对python中的select模块有些困惑。正如PyMOTW所描述的:
select监视套接字,打开的文件和管道(带有 返回有效文件描述符的fileno()方法),直到它们 变得可读或可写,或者发生通信错误。
我对可读和可写的含义感到困惑?它们之间有什么区别?
此外,它描述:
select()返回三个新列表,其中包含内容的子集 传入的列表中的所有内容。可读列表中的所有套接字都具有 传入的数据已缓冲并且可以读取。所有插座 可写列表的缓冲区中有可用空间,可以写入 至。以特殊方式返回的套接字有一个错误(实际 “例外条件”的定义取决于平台。
因此,据我所知,选择模块就是这样一种工具,它可以在多个套接字打开并工作时监视它们。 Select可以告诉特定的套接字它应该读取数据,写入数据还是有错误。那正确吗?有人可以向我解释它如何实现多连接套接字通信吗?
答案 0 :(得分:0)
select
不会告诉套接字任何信息。它只是看着他们。
假设您有一栋只有一个入口的建筑物。您在那发布一个接待员。他看着门,当门口有人时,他去为客人打开门。
现在您建立了一个后门,但您太便宜了,无法聘请第二位接待员。因此,当前台接待员盯着前门时,后门却堆满了非常生气的人,盯着顽固的关门。
如果只有监视系统,以便可怜的接待员可以同时看到两扇门……
select
就是这样。
通常,当您f.read()
(在阻止文件描述符上)时,程序会停止运行,直到显示一些数据为止。当您f.write()
但另一端已表明其缓冲区已满时,您的程序将停止,直到另一端清除其缓冲区中的某些空间并发出信号,可以再次接收。而且,当程序停留在某些IO操作上时,它无能为力-在堆积其他套接字中的传入数据时,或者在其他套接字上的用户不耐烦地等待其响应时。
使用select
,它一直等到任何文件描述符都可以处理。它会等到某些事情变为可操作为止。然后它将告诉您f.read
会在何时得到响应,write
会在哪里被立即发送,而无需进一步阻止。