一个用于管理其他许多人的asyncio程序

时间:2017-08-20 17:39:28

标签: python asynchronous subprocess python-asyncio discord

最近,我一直在尝试使用asyncio的discord bots。我一直在制作一个控制很多其他机器人的程序,即时打开和关闭它们,但我有一个问题;我已经尝试过subprocess.Popen,rpyc和multiprocessing,但我正在努力研究如何在程序之间进行通信。我尝试使用以下代码行启动子进程:

Popen('python smallprogram.py', stdout=PIPE, stdin=PIPE)

但由于较小的程序需要运行asyncio,我仍然无法从主程序与较小程序进行通信。这使我无法在Popen.communicate()中使用input()。 理想情况下,我想在需要时调用较小程序上的函数,小程序仍在运行asyncio。我不介意将相同的代码块粘贴到每个较小的程序中,但我认为这也可以通过一些输入来解决?

可以这样做吗?我之前从未创建过API,但似乎我可能需要使用API​​作为模板。谢谢:))

注意:我只是需要进行大型和小型的沟通,但反过来这样做也很不错。

1 个答案:

答案 0 :(得分:0)

many ways来处理进程间通信,我认为使用stdin/stdout是一种有效的方法。

事实证明,可以在asyncio中从stdin异步读取,但只使用标准库quite tricky to do

或者,您可以使用aioconsole助手ainput

import aioconsole

async def echo_child():
    data = await aioconsole.ainput()
    print(data, end='')

get_standard_streams用于与stream API类似的界面:

import aioconsole

async def echo_child():
    stdin, stdout = await aioconsole.get_standard_streams()
    data = await stdin.readline()
    stdout.write(data)

在父方:

import asyncio

async def parent():
    proc = await asyncio.create_subprocess_exec(
        sys.executable, 'child.py',
        stdin=asyncio.subprocess.PIPE,
        stdout=asyncio.subprocess.PIPE)
    proc.stdin.write(b'Hello\n')
    data = await proc.stdout.readline()
    print(data.decode().strip())
    proc.terminate()