我可以在同一asyncio循环中读写过程吗?

问题描述 投票:0回答:1

我有一个读取输入和写入输出的过程,例如doubler(实际上是一个黑匣子,输入和输出完全独立)

#!/bin/bash
while read -r i; do
    sleep 0.$RANDOM
    echo $((i*2))
done

以及我的Python代码中的一些函数以异步方式提供了该过程:

import asyncio
import subprocess
import random

class Feeder:
    def __init__(self):
        self.process = subprocess.Popen(['doubler.sh'],
                                        stdin=subprocess.PIPE)

    def feed(self, value):
        self.process.stdin.write(str(value).encode() + b'\n')
        self.process.stdin.flush()

feeder = Feeder()

async def feed_random():
    while True:
        feeder.feed(random.randint(0, 100))
        await asyncio.sleep(1)

async def feed_tens():
    while True:
        feeder.feed(10)
        await asyncio.sleep(3.14)

async def main():
    await asyncio.gather(
        feed_random(),
        feed_tens(),
    )

if __name__ == '__main__':
    asyncio.run(main())

这很好。但我也想阅读该过程的输出,如下所示:

...
stdout=subprocess.PIPE
...
for line in feeder.process.stdout:
    print("The answer is " + line.decode())

但是这很困难,因此不会发生喂食。可以在相同的循环中完成此操作吗?还是我需要另一个线程?

我有一个读取输入并写入输出的过程,就像这个倍增器:(实际上它实际上是一个黑匣子,输入和输出是完全独立的)#!/ bin / bash而读取-r i;做...
python python-3.x subprocess python-asyncio
1个回答
0
投票
这样的事情应该起作用。为了异步读取stdout,您必须切换到asyncio.subprocess
© www.soinside.com 2019 - 2024. All rights reserved.