2011-01-31 19 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不一致,知之甚少!