Según tengo entendido, las E/S asíncronas no son lo mismo que las E/S sin bloqueo.
En el caso de no bloqueo O, una vez que un descriptor de archivo es de instalación/I sea "no bloqueante", una llamada read()
sistema (por ejemplo) volverá EWOULDBLOCK
(o EAGAIN
) si la operación de lectura bloquearía el proceso de llamada para completar la operación. Las llamadas al sistema select()
, poll()
, epoll()
, etc. se proporcionan para que el proceso pueda solicitar al SO que se le informe cuando uno o más descriptores de archivos se convierten en disponibles para realizar alguna operación de E/S.
La E/S asincrónica opera al poner en cola una solicitud de E/S al descriptor de archivo, rastreado independientemente del proceso de llamada. Para un descriptor de archivo que admita E/S asíncrona (por lo general, devdes de disco sin formato), un proceso puede llamar al aio_read()
(por ejemplo) para solicitar que se lea una cantidad de bytes del descriptor de archivo. La llamada al sistema regresa inmediatamente, ya sea que la E/S haya finalizado o no. Algún tiempo después, el proceso sondea el sistema operativo para la finalización de la E/S (es decir, el búfer está lleno de datos).
Un proceso (de una sola hebra) que solo realiza E/S sin bloqueo podrá leer o escribir desde un descriptor de archivo que está listo para E/S cuando otro no está listo. Pero el proceso debe emitir sincrónicamente las llamadas al sistema para realizar la E/S a todos los descriptores de archivos listos. Mientras que, en el caso de E/S asíncrona, el proceso solo está verificando la finalización de la E/S (búfer lleno de datos). Con E/S asíncrona, el sistema operativo tiene la libertad de operar en paralelo tanto como sea posible para dar servicio a la E/S, si así lo desea.
Con eso, ¿hay alguna envoltura para el sistema POSIX aio_read/write etc. llamadas al sistema para Python?
Lamentablemente, O_NONBLOCK (que es lo que la API FDESC se vincula a realmente) no funciona con archivos locales del disco duro. es decir, la especificación POSIX dice que se debe ignorar y se ignora diligentemente en cada sistema UNIX que conozco. Si piensas que es una idea estúpida, no podría estar más de acuerdo, pero hay muchas razones históricas y de implementación por las que esto es así. En resumen, si desea IO asíncrona a los archivos del disco duro local, es mejor utilizar los hilos y diferir IO a un hilo IO o utilizar la API AIO. – mathieu