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()?这意味着文档应该容易混淆地说:“增加了传递类文件对象的能力,但实际上不是文件对象。”
答案 0 :(得分:2)
FDs 0,1和2通常(但不总是!)管道而不是常规文件。 IOLoop文档可能应该说&#34;类似套接字的对象&#34;而不是&#34;类似文件的对象&#34;,或简单地使用fileno方法&#34;对象&#34;。
IOLoop支持的文件描述符类型因平台而异。在Posix平台上,它支持套接字和管道(可能还有其他一些像ttys),在Windows上它只支持套接字。