2011-12-27 6 views
6

el siguiente código esencialmente gatos un archivo con select.select():¿Por qué select.select() funciona con archivos de disco pero no 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) 

Cuando intento algo similar con epoll Me aparece un error:

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

También he leído que epoll no admite archivos de disco, o tal vez no tenga sentido.

Epoll on regular files

Pero ¿por qué no seleccionar) los archivos del disco de soporte (entonces? Miré la implementación en selectmodule.c y parece que solo está yendo al sistema operativo, es decir, Python no agrega ningún soporte especial.

En un nivel superior estoy experimentando con la mejor manera de servir archivos estáticos en un servidor sin bloqueo. Supongo que intentaré crear subprocesos de E/S que se leen desde el disco y alimentar los datos al subproceso de bucle de evento principal que se escribe en los sockets.

Respuesta

7

select permite que los descriptores de archivos que apuntan a archivos regulares sean monitoreados, sin embargo siempre reportará que un archivo es legible/escribible (es decir, es inútil, ya que no le dice si una lectura/escritura realmente bloquearía).

epoll simplemente desautoriza el seguimiento de los archivos normales, ya que no tiene un mecanismo (en Linux por lo menos) disponibles para determinar si la lectura/escritura de un archivo normal bloquearía

+0

Ah OK, así que mi os.read() en el lazo de selección está bloqueando entonces. tiene sentido. –

+0

@ user1117755 Sí, está bloqueando si tiene que esperar al disco duro. – nos

Cuestiones relacionadas