python选择器模块有什么作用以及它是如何工作的?(python3)

Joe*_*min 5 sockets python-3.x

我想知道选择器模块是如何工作的以及如何在套接字编程中使用它。selector.register() 的作用是什么?我搜索了很多,但找不到任何东西,所以我无法理解它。

Ser*_*sta 7

选择器模块是围绕旧select功能的更高级别接口。该select功能是在 80 年代为 Unix BSD 4.2 操作系统以及界面的其他部分发明的Berkeley sockets。与套接字接口的其余部分一样,它现在仍在使用中,以允许单个执行线程处理多个传入和传出连接=>这是我所知道的使用有限资源处理大网络吞吐量的最佳方法。

的底层引擎是呈现接口列表select的就绪状态(读和写)。从那时起,应用程序(以及应用程序程序员)有责任仅在操作无法阻塞时使用该信息来读取或写入套接字。没那么难,但是线程模型(每个连接一个执行线程)对于人类来说要自然得多(除了神以外的大多数程序员)。

Pythonselector模块在 select 之上提供了一个事件驱动的接口:

  • 程序员注册许多接口并可以动态添加或删除套接字
  • 对于每个套接字,程序员声明当它准备好读取或写入时应该做什么

从功能上来说,它与旧模块完全相同select。但它具有所有 OOP 优点和事件驱动模式,对程序员更加友好。习惯了selectC语言编程的老恐龙可能会发现,一个新的界面并不值得学习。但恕我直言,事实是它允许编写更易于阅读和测试的代码。


Joe*_*min 3

基本上,选择器模块使我们能够跟踪套接字。我们可以用它来注册和取消注册套接字。

对此进行类比,选择器对象就像笔记本。每次我们创建一个新的套接字时,我们都会将其记在笔记本中以供以后使用。完成后,我们将其从笔记本中删除。这不是它在现实中的工作原理(我不确定它是否真的是这样工作的),但这个类比帮助我更容易地理解它。

现在,您可能会想当袜子注册后会发生什么?一个对象是用一些属性创建的,比如袜子号、回调,并且它被添加到某种列表中。

如果有人纠正我的解释,我将不胜感激。