1

我正在尝试编写一个与 Python 2 标准库的socket.socket.

当程序尝试调用对象时,我在尝试重现对象应具有的行为时遇到问题select.select()
条目中的文档select.select说:

你也可以自己定义一个包装类,只要它有一个适当的 fileno() 方法(它真的返回一个文件描述符,而不仅仅是一个随机整数)。

我想尝试这样的事情:创建一个类似文件的对象,该对象可以由我的程序的一个线程使用 select 控制,而当我的对象准备好读写时,我的程序的另一个线程可以设置它。我该怎么做?

4

1 回答 1

3

fileno() 函数需要返回一个内核文件描述符,以便可以将其传递给 select 系统调用(或 poll/epoll/whatever)。由 select-like 操作完成的多路复用基本上是一个必须在 OS 对象上工作的 OS 操作。

如果要为不基于实际文件描述符的对象实现此功能,可以执行以下操作:

  • 创建管道
  • 从 fileno() 返回管道的读取端
  • 当您想将对象标记为“就绪”时,向另一端写入一个字节。这将唤醒任何选择调用。
  • 请记住从您真正的“读取”实现中读取该字节。

这个管道技巧应该是相当便携的。

于 2012-11-16T16:30:27.327 回答