一个异步程序来管理许多其他程序

Posted

技术标签:

【中文标题】一个异步程序来管理许多其他程序【英文标题】:One asyncio program to manage many others 【发布时间】:2018-01-28 19:37:24 【问题描述】:

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

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

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

这可以吗?我以前从未制作过 API,但似乎我可能需要使用 API 作为模板。谢谢你:)

注意:我只需要进行大->小交流,但反过来做也不错。

【问题讨论】:

为什么不简单地产生新的异步任务而不是使用子进程? @Vincent 我不太熟悉如何去做这件事。该程序的想法是我可以即时修改机器人,这意味着我可以修改一个人的代码而无需重新启动其他人,以及手动注入代码。这不需要预先编写机器人吗? 是的。有关更多信息,请参阅我的答案。 【参考方案1】:

有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()

【讨论】:

以上是关于一个异步程序来管理许多其他程序的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化异步pthreads代码段

作为一个程序员,如何高效的管理时间?

对其他 Spring Boot 应用程序的集中会话管理

红帽软件包管理器(转)

操作系统概述

在开发过程中管理多个应用配置文件