select.select()与常规文件

时间:2011-01-31 16:45:29

标签: python select file-io

有人知道select.select()是使用常规文件还是只使用套接字/管道?

我在Solaris,Linux和Mac OS X上尝试过 - 它不会阻止select.select()调用。

它只会爆炸我的大脑,尝试这样的事情没有运气

import os
import select

fds = [ os.open("read.txt", os.O_RDONLY) ]

while True:
    reads, _, _ = select.select(fds, [], [], 2.0)
    if 0 < len(reads):
        print "-> ",os.read(reads[0], 10)
    else:
        print "timeout"

3 个答案:

答案 0 :(得分:2)

来自documentation

  

请注意,在Windows上,它只能起作用   用于插座;在其他经营   系统,它也适用于其他文件   类型(特别是在Unix上,它   适用于管道)。它不能用于   常规文件,以确定是否   文件自上次阅读以来已经增长。

这有帮助吗?

答案 1 :(得分:1)

select也适用于文件,但我认为文件的FD将随时可用。

您还应该检查是否到达了文件的末尾。这是一个适合我的例子:

import os
import select

fds = [ os.open("data", os.O_RDONLY) ]

while True:
    reads, _, _ = select.select(fds, [], [], 2.0)
    if 0 < len(reads):
        d = os.read(reads[0], 10)
        if d:
            print "-> ", d
        else:
            break
    else:
        print "timeout"

答案 2 :(得分:1)

我刚遇到同样的问题:

Why does select.select() work with disk files but not epoll()?

答案是它并没有真正起作用,因为内核中任何非阻塞I / O的方法都不支持磁盘文件。 select()恰好返回“True”,然后读取()块,就像你找到的那样。是的,Unix是不一致的,也很难理解!