IOLoop.add_handler不接受某些文件描述符

时间:2014-12-08 03:24:56

标签: python tornado

Python tornado的IOLoop.add_handler(fd,handler,events)说“fd参数可以是整数文件描述符,也可以是带有fileno()方法的文件类对象”,从4.0开始,它“添加了传递文件的能力 - 像原始文件描述符一样的对象。

但是,在Linux上添加类似文件的对象(实际文件对象)失败:

>>> loop.add_handler (open ('XYZ'), handler, loop.READ)
IOError: [Errno 1] Operation not permitted

直接添加文件描述符也会失败,即使接受了stdin,stdout,stderr:

>>> from tornado import ioloop
>>> loop = ioloop.IOLoop.current ()
>>> f = open ('XYZ')
>>> f.fileno()
4
>>> def handler (fd, events): pass
...
>>> loop.add_handler (0, handler, loop.READ)
>>> loop.add_handler (1, handler, loop.READ)
>>> loop.add_handler (2, handler, loop.READ)
>>> loop.add_handler (4, handler, loop.READ)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 677, in add_handler
    self._impl.register(fd, events | self.ERROR)
IOError: [Errno 1] Operation not permitted

This explanation表示异步IO不适用于常规文件。

fd的0,1,2和open('XYZ')的fd是否存在非常不同的东西.fileno()?这意味着文档应该容易混淆地说:“增加了传递类文件对象的能力,但实际上不是文件对象。”

1 个答案:

答案 0 :(得分:2)

FDs 0,1和2通常(但不总是!)管道而不是常规文件。 IOLoop文档可能应该说&#34;类似套接字的对象&#34;而不是&#34;类似文件的对象&#34;,或简单地使用fileno方法&#34;对象&#34;。

IOLoop支持的文件描述符类型因平台而异。在Posix平台上,它支持套接字和管道(可能还有其他一些像ttys),在Windows上它只支持套接字。