tutorial traduccion serie recetas meaning food python twisted

python - traduccion - twisted serie



Acceso no bloqueado a los archivos con Twisted (5)

Estoy tratando de averiguar si hay un patrón de facto para el acceso a archivos usando retorcido. Muchos ejemplos que he visto (twisted.python.log, twisted.persisted.dirdbm, twisted.web.static) en realidad no parecen preocuparse por el bloqueo para el acceso a archivos.

Parece que debería haber alguna interfaz obvia, probablemente heredada de abstract.FileDescriptor, que todo el acceso a los archivos debería pasar por ella como productor / consumidor.

¿He olvidado algo o es solo que el uso principal de la programación asincrónica torcida es para redes y realmente no se ha desarrollado para otras operaciones de descriptores de archivos, sin preocuparme por la pureza de la IO sin bloqueo?


Creo que estás buscando el módulo fdesc . Para obtener más información sobre la E / S sin bloqueo en Python, también puede ver este video .


El módulo fdesc puede ser útil para hablar de forma asíncrona con un socket o tubería, pero cuando se le da un fd que se refiere a un archivo de sistema de archivos normal, bloquea io (y mediante una interfaz bastante extraña). Para el disco io, fdesc es efectivamente aceite de serpiente; no lo uses

A partir de mayo de 2017, la única forma razonable de obtener un async disk io en twisted es envolver las llamadas io síncronas en un deferToThread .


Hay un boleto abierto para esto en Twisted - #3983 .


No estoy seguro de lo que quieres lograr. Cuando inicie sesión, Python se asegurará (mediante el registro de intérprete global) de que los mensajes de registro de varios subprocesos van al archivo uno tras otro.

Si le preocupa bloquear el IO, el sistema operativo agrega buffers predeterminados para sus archivos (generalmente 4KB), y puede pasar un tamaño de buffer en la llamada open() .

Si le preocupa algo más, aclare su pregunta.


Después de muchas búsquedas, pruebas y errores, finalmente me di cuenta de cómo usar fdesc .

from __future__ import print_function from twisted.internet.task import react from twisted.internet import stdio, protocol from twisted.internet.defer import Deferred from twisted.internet.fdesc import readFromFD, setNonBlocking class FileReader(protocol.Protocol): def __init__(self, filename): self.f = open(filename, ''rb'') def dataReceived(self, data): self.transport.write(data) def connectionMade(self): fd = self.f.fileno() setNonBlocking(fd) readFromFD(fd, self.dataReceived) def connectionLost(self, reason): self.f.close() def main(reactor, filename): stdio.StandardIO(FileReader(filename))

[Edición: También acabo de descubrir una forma más sencilla que no requiere el uso de un protocolo]

def getFile(filename): with open(filename) as f: d = Deferred() fd = f.fileno() setNonBlocking(fd) readFromFD(fd, d.callback) return d def main(reactor, filename): d = getFile(filename) return d.addCallback(print)

Corre bien de esta manera:

react(main, [''/path/to/file''])