2011-12-27 9 views
6

次のコードは、基本的に猫select.selectのファイルは():私もそのファイルディスクリプタを読んだselect.select()はepoll()ではなくディスクファイルで動作するのはなぜですか?

self._impl.register(fd, events | self.ERROR) 
IOError: [Errno 1] Operation not permitted 

:私はファイルディスクリプタと同じようなことをしようとすると

f = open('node.py') 
fd = f.fileno() 
while True: 
    r, w, e = select.select([fd], [], []) 
    print '>', repr(os.read(fd, 10)) 
    time.sleep(1) 

私はエラーを取得しますディスクファイルをサポートしていないか、おそらくそれは意味をなさないということです。

Epoll on regular files

しかし、なぜ、その後()のサポートディスクのファイルを選択しますか?私はselectmodule.cの実装を見ていて、オペレーティングシステムに移行しているようです。つまり、Pythonは特別なサポートを追加していません。

私は、ノンブロッキングサーバーで静的ファイルを提供する最善の方法を試しています。私は、ディスクから読み込み、ソケットに書き込むメインイベントループスレッドにデータを送るI/Oスレッドを作成しようとします。

答えて

7

selectでは、通常のファイルを指し示すファイル記述子を監視することができますが、ファイルは常に読み書き可能であると報告されます(読み書きが実際にブロックするかどうかは分かりません)。定期的にファイルの書き込み/読み込みするかどうかを伝えるために利用できる

それは(少なくともLinuxの場合)機構がないとのepollだけで、通常のファイルの監視を禁止するには、ああ

+0

をブロックし、[OK]、ので、私のos.read()はで呼び出します選択ループがブロックされます。理にかなっている。 –

+0

@ user1117755はい、ハードドライブを待つ必要がある場合はブロックします。 – nos

関連する問題