I have two classes, Task1 and Task2. Task1 should read from a TCP/IP port and send up a pipe to Task2. Task2 should return the data to Task1 who echoes this to the client. This is just an experiment. Task2 will eventually process the data and send to another piece of hardware across a serial line. Task1 and Task2 should run on separate cores. I cannot see how to get the pipe reference into the tasks. It is not really necessary Task1 be different from the application. Just has to monitor a TCP/IP port and a pipe asynchronously.
Task1
import asyncio
import os
from multiprocessing import Pipe
import sys
class Task1:
def __init__(self, pipe):
self.comm_pipe = pipe
async def run(self, reader, writer):
while True:
data = await reader.read(100)
if data:
self.comm_pipe.send(data)
else:
break
if self.comm_pipe.poll():
data_from_pipe = self.comm_pipe.recv()
writer.write(data_from_pipe)
await writer.drain()
writer.close()
async def task_main():
server = await asyncio.start_server(
lambda r, w: Task1(?????).run(r, w),
'0.0.0.0', 4365)
addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')
async with server:
await server.serve_forever()
def main(pipe):
asyncio.run(task_main())
Task2
import asyncio
from multiprocessing import Pipe
class Task2:
def __init__(self, pipe):
self.pipe = pipe
async def run(self):
while True:
if self.pipe.poll():
data = self.pipe.recv()
reversed_data = data[::-1]
self.pipe.send(reversed_data)
if __name__ == "__main__":
task2 = Task2(????????)
asyncio.run(task2.run())
App
import multiprocessing
import Task1
import Task2
if __name__ == "__main__":
parent_pipe1, child_pipe1 = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=Task1.main, args=(parent_pipe1,))
p2 = multiprocessing.Process(target=Task2.main, args=(child_pipe1,))
p1.start()
p2.start()
p1.join()
p2.join()
source https://stackoverflow.com/questions/77341186/getting-a-pipe-reference-into-a-task
Comments
Post a Comment