2008-11-25 11 views

Respuesta

3

Twisted tiene non-blocking writes on file descriptors. Si está escribiendo código asíncrono, espero que esté usando retorcido, de todos modos. :)

+10

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

17

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?

+0

Una cosa para agregar: como dice el comentarista de la primera respuesta, no hay sistemas que realmente sigan a O_NONBLOCK en los archivos, es solo para enchufes. Si desea un archivo IAS portátil y no sincronizado en Unix, debe utilizar POSIX AIO o descargar su IO síncrono a un threadpool. –

0

Python 3 parece tener dicha funcionalidad. Ver PEP 3116.

+1

Parece que PEP 3116 está relacionado con una nueva abstracción de E/S que incluye E/S sin bloqueo. Sin embargo, la E/S sin bloqueo no es lo mismo que la E/S asincrónica. La E/S sin bloqueo generalmente no se aplica a las escrituras locales del sistema de archivos. –

2

estoy desarrollando aio.h bidings a Python: pyaio

Se ejecuta en Linux solamente ..

Cuestiones relacionadas