Saltar al contenido

¿Puedo usar asyncio para leer y escribir en un multiprocessing.Pipe?

Buscamos por todo el mundo online para así mostrarte la respuesta a tu dilema, si continúas con inquietudes deja tu inquietud y contestamos con mucho gusto.

Solución:

aiopipe parece hacer lo que quieres! Se puede utilizar con el integrado. multiprocessing módulo, y proporciona una API similar a las tuberías de bloqueo regulares.

multiprocessing.Pipe utiliza el nivel alto multiprocessing.Connection módulo que encurte y desencurte objetos de Python y transmita bytes adicionales debajo del capó. Si quisiera leer datos de una de estas tuberías usando loop.connect_read_pipe()tendría que volver a implementar todo esto usted mismo.

La forma más fácil de leer de un multiprocessing.Pipe sin bloquear el bucle de eventos sería usar loop.add_reader(). Considere el siguiente ejemplo:

import asyncio
import multiprocessing


def main():
    read, write = multiprocessing.Pipe(duplex=False)
    writer_process = multiprocessing.Process(target=writer, args=(write,))
    writer_process.start()
    asyncio.get_event_loop().run_until_complete(reader(read))


async def reader(read):
    frame_available = asyncio.Event()
    asyncio.get_event_loop().add_reader(read.fileno(), frame_available.set)
    await frame_available.wait()
    frame_available.clear()
    print(read.recv())


def writer(write):
    write.send('Hello World')


if __name__ == '__main__':
    main()

Tuberías creadas con el nivel inferior os.pipe no agregue nada extra de la forma en que las tuberías de multiprocessing.Pipe hacer. Como resultado, podemos usar os.pipe con loop.connect_read_pipe(), sin volver a implementar ningún tipo de funcionamiento interno. Aquí hay un ejemplo:

import asyncio
import multiprocessing
import os


def main():
    read, write = os.pipe()
    writer_process = multiprocessing.Process(target=writer, args=(write,))
    writer_process.start()
    asyncio.get_event_loop().run_until_complete(reader(read))


async def reader(read):
    pipe = os.fdopen(read, mode='r')

    loop = asyncio.get_event_loop()
    stream_reader = asyncio.StreamReader()
    def protocol_factory():
        return asyncio.StreamReaderProtocol(stream_reader)

    transport, _ = await loop.connect_read_pipe(protocol_factory, pipe)
    print(await stream_reader.readline())
    transport.close()


def writer(write):
    os.write(write, b'Hello Worldn')


if __name__ == '__main__':
    main()

Este código me ayudó a descubrir cómo usar loop.connect_read_pipe.

valoraciones y reseñas

Nos puedes añadir valor a nuestro contenido asistiendo con tu experiencia en los comentarios.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *