2011-01-31 11 views
2

select.select()が普通のファイルで動作するのか、ソケット/パイプだけで動作するのか誰にも分かりますか?select.select()with regular files

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を通常のファイルで読みやすくする。 –

答えて

2

Windows上で、それが唯一のソケットの を動作することを注意。他の操作の システムでは、他のファイル タイプ(特にUnixではパイプ上では )にも対応しています。 通常ファイルで最後に読み取られた後に ファイルが成長したかどうかを判断するために使用することはできません。

これは役に立ちますか?

1

selectと、このような何かをしようとすることも、ファイルのために働くが、私は、ファイルのつもりのためのFDは常に準備ができて考える必要があります。

また、ファイルの最後に達したかどうかを確認する必要があります。ここで私の作品例です:documentationから

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"を返し、次に見つけたようにread()ブロックを返します。はい、Unixは一貫性がなく、理解が不十分です!