模仿fileno()的行为并选择

时间:2012-11-16 16:20:02

标签: python file networking

我试图用Python 2标准库socket.socket的相同界面编写一个类。

当程序试图在其上调用select.select()时,尝试重现该对象应具有的行为时出现问题。
select.select条目中的文档说:

  

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

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

1 个答案:

答案 0 :(得分:3)

fileno()函数需要返回一个内核文件描述符,以便它可以传递给select系统调用(或poll / epoll / whatever)。类似select的操作所做的多路复用基本上是一个必须在OS对象上运行的OS操作。

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

  • 创建管道
  • 从fileno()
  • 返回管道的读取端
  • 如果要将对象标记为“就绪”,请将字节写入另一端。这将唤醒所有选择的电话。
  • 请记住从真正的“阅读”实施中读取该字节。

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