2011-12-27 16 views
6

下面的代碼基本上與貓一個select.select文件():爲什麼select.select()可以使用磁盤文件但不使用epoll()?

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的類似的事情,我得到一個錯誤:

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

我也讀到的epoll不支持磁盤文件 - 或者它沒有意義。

Epoll on regular files

但爲什麼選擇()支持磁盤文件呢?我查看了selectmodule.c中的實現,它似乎只是進入了操作系統,即Python沒有增加任何特殊的支持。

在更高級別上,我正在試驗在非阻塞服務器中提供靜態文件的最佳方式。我想我會嘗試創建從磁盤讀取的I/O線程並將數據提供給寫入套接字的主事件循環線程。

回答

7

select允許filedescriptors指向常規文件進行監視,但是它總會將文件報告爲可讀/可寫(即它沒有任何意義,因爲它不會告訴您讀/寫是否會實際阻止)。

epoll的只是不允許的常規文件監控,因爲它沒有機制(在Linux至少)可以告訴是否讀/寫一個普通的文件會阻止

+0

啊OK,所以我os.read()調用那麼選擇循環就會阻塞。說得通。 – 2011-12-27 18:41:56

+0

@ user1117755是的,如果它必須等待硬盤驅動器,它會阻止。 – nos 2011-12-27 22:55:32

相關問題