一个 asyncio 程序来管理许多其他程序
One asyncio program to manage many others
最近我一直在试验 discord bots,它使用 asyncio。我一直在制作一个程序来控制许多其他机器人,即时打开和关闭它们,但我有一个问题;我已经尝试过 subprocess.Popen、rpyc 和多处理,但我正在努力弄清楚如何在程序之间进行通信。我尝试使用以下代码行来启动子进程:
Popen('python smallprogram.py', stdout=PIPE, stdin=PIPE)
但我仍然无法从主程序与较小的程序通信,因为较小的程序需要 运行 asyncio。这使我无法将 input() 与 Popen.communicate() 一起使用。
理想情况下,我想要一种在需要时在小程序上调用函数的方法,小程序仍然 运行ning asyncio。我不介意将相同的代码块粘贴到每个较小的程序中,但我认为这也可以通过一些输入来解决?
这能做到吗?我以前从未制作过 API,但似乎我可能需要使用 API 作为模板。谢谢:)
注意:我只需要进行大->小的交流,但反过来也很好。
有 many ways 来处理进程间通信,我认为您使用 stdin/stdout
是一种有效的方法。
结果证明可以在 asyncio 中从 stdin
异步读取,尽管 仅使用标准库。
或者,您可以使用 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()
最近我一直在试验 discord bots,它使用 asyncio。我一直在制作一个程序来控制许多其他机器人,即时打开和关闭它们,但我有一个问题;我已经尝试过 subprocess.Popen、rpyc 和多处理,但我正在努力弄清楚如何在程序之间进行通信。我尝试使用以下代码行来启动子进程:
Popen('python smallprogram.py', stdout=PIPE, stdin=PIPE)
但我仍然无法从主程序与较小的程序通信,因为较小的程序需要 运行 asyncio。这使我无法将 input() 与 Popen.communicate() 一起使用。 理想情况下,我想要一种在需要时在小程序上调用函数的方法,小程序仍然 运行ning asyncio。我不介意将相同的代码块粘贴到每个较小的程序中,但我认为这也可以通过一些输入来解决?
这能做到吗?我以前从未制作过 API,但似乎我可能需要使用 API 作为模板。谢谢:)
注意:我只需要进行大->小的交流,但反过来也很好。
有 many ways 来处理进程间通信,我认为您使用 stdin/stdout
是一种有效的方法。
结果证明可以在 asyncio 中从 stdin
异步读取,尽管
或者,您可以使用 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()