关于Python中的选择模块的困惑

时间:2019-02-13 04:07:45

标签: python select

我对python中的select模块有些困惑。正如PyMOTW所描述的:

  

select监视套接字,打开的文件和管道(带有   返回有效文件描述符的fileno()方法),直到它们   变得可读或可写,或者发生通信错误。

我对可读和可写的含义感到困惑?它们之间有什么区别?

此外,它描述:

  

select()返回三个新列表,其中包含内容的子集   传入的列表中的所有内容。可读列表中的所有套接字都具有   传入的数据已缓冲并且可以读取。所有插座   可写列表的缓冲区中有可用空间,可以写入   至。以特殊方式返回的套接字有一个错误(实际   “例外条件”的定义取决于平台。

因此,据我所知,选择模块就是这样一种工具,它可以在多个套接字打开并工作时监视它们。 Select可以告诉特定的套接字它应该读取数据,写入数据还是有错误。那正确吗?有人可以向我解释它如何实现多连接套接字通信吗?

1 个答案:

答案 0 :(得分:0)

select不会告诉套接字任何信息。它只是看着他们。

假设您有一栋只有一个入口的建筑物。您在那发布一个接待员。他看着门,当门口有人时,他去为客人打开门。

现在您建立了一个后门,但您太便宜了,无法聘请第二位接待员。因此,当前台接待员盯着前门时,后门却堆满了非常生气的人,盯着顽固的关门。

如果只有监视系统,以便可怜的接待员可以同时看到两扇门……

select就是这样。

通常,当您f.read()(在阻止文件描述符上)时,程序会停止运行,直到显示一些数据为止。当您f.write()但另一端已表明其缓冲区已满时,您的程序将停止,直到另一端清除其缓冲区中的某些空间并发出信号,可以再次接收。而且,当程序停留在某些IO操作上时,它无能为力-在堆积其他套接字中的传入数据时,或者在其他套接字上的用户不耐烦地等待其响应时。

使用select,它一直等到任何文件描述符都可以处理。它会等到某些事情变为可操作为止。然后它将告诉您f.read会在何时得到响应,write会在哪里被立即发送,而无需进一步阻止。