2011-12-27 8 views
6

il seguente codice essenzialmente gatti un file con select.select():Perché select.select() funziona con i file su disco ma non con 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) 

Quando provo una cosa simile con epoll ottengo un errore:

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

Ho anche letto che epoll non supporta i file su disco, o forse non ha senso.

Epoll on regular files

Ma perché non selezionare) i file su disco di supporto (allora? Ho esaminato l'implementazione in selectmodule.c e sembra passare solo al sistema operativo, cioè Python non sta aggiungendo alcun supporto speciale.

A un livello superiore sto sperimentando il modo migliore per servire file statici in un server non bloccante. Credo che proverò a creare i thread I/O che leggono dal disco e alimentano i dati al thread del ciclo degli eventi principale che scrive sui socket.

risposta

7

select consente agli archivi che puntano a file regolari di essere monitorati, tuttavia segnala sempre un file come leggibile/scrivibile (ovvero è in qualche modo inutile, in quanto non indica se una lettura/scrittura potrebbe effettivamente bloccare).

epoll solo disabilita il monitoraggio dei file regolari, in quanto non ha alcun meccanismo (su Linux almeno) a disposizione per dire se la lettura/scrittura di un file normale avrebbe bloccato

+0

ah ok, quindi il mio os.read() chiamare il ciclo di selezione sta bloccando quindi. ha senso. –

+0

@ user1117755 Sì, sta bloccando se deve attendere il disco rigido. – nos

Problemi correlati