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.