2011-01-31 66 views
2

有没有人知道select.select()是否适用于普通文件或仅适用于套接字/管道?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" 
+1

这与python比底层操作系统有关。使用常规文件更好地阅读非阻塞io和异步io。 – 2011-01-31 18:26:57

回答

2

documentation

需要注意的是在Windows上,它仅适用于 插座;在其他操作 系统上,它也适用于其他文件 类型(特别是在Unix上,它在管道上工作)。它不能用于 常规文件,以确定 文件自上次读取以来是否已增长。

这有帮助吗?

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" 
1

我只是碰到了同样的问题:

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

答案是,它并没有真正的工作,因为在内核非阻塞I/O的任何方法不支持磁盘文件。 select()只是返回“True”,然后读取()块,就像你找到的那样。是的,Unix不一致,知之甚少!