gpt4 book ai didi

python - Python中主进程和子进程之间的动态通信

转载 作者:太空狗 更新时间:2023-10-29 18:07:59 24 4
gpt4 key购买 nike

我在 Python 中工作,我想找到一个工作流来使两个进程(主进程子进程)能够相互通信。我的意思是 主进程 将一些数据发送到 子进程 的能力(也许,通过写入 子进程的 stdin ) 以及 子进程 将一些数据发送回主进程的能力。这也意味着两者都可以读取发送给他们的数据(我正在考虑从标准输入读取)。

我试图使用 subprocess 库,但它似乎旨在与旨在仅提供一次输出然后终止的进程一起使用,而我想交换数据动态并仅在收到此类命令时关闭子进程。

我在 StackOverflow 上阅读了很多解决与我密切相关的问题的答案,但没有一个让我感到满意,因为这些答案所针对的问题在一个重要细节上与我的不同:我需要我的 < em>主进程能够与其子进程根据需要动态多次交换数据,而不仅仅是一次,这反过来意味着 子进程 应该运行,直到它从 main-process 接收到某个终止命令。

我愿意使用第三方库,但如果您提出一个完全基于 Python 标准库的解决方案,那就更好了。

最佳答案

您想用 subprocess.PIPE 创建一个 Popen 对象用于标准输入和输出,并使用它的文件对象进行通信——而不是使用 戏法,例如run(以及较早的、更具体的,例如check_output)。挑战在于避免死锁:很容易陷入这样一种情况,即每个进程都在尝试写入,管道缓冲区已满(因为没有人从中读取),一切都挂起。您还必须记住在两个进程中都flush,以避免请求或响应卡在 file 对象的缓冲区中。

提供

Popen.communicate 是为了避免这些问题,但它仅支持单个字符串(而不是正在进行的对话)。传统的解决方案是select,但它也可以使用单独的线程来发送请求和读取结果。 (这是尽管有 GIL 而使用 CPython 线程的原因之一:每个线程都存在以运行而另一个被阻塞,因此几乎没有争用。)当然,同步 是一个问题,并且您可能需要做一些工作来使多线程客户端在外部表现得像一个简单的同步函数调用。

请注意,两个进程都需要flush,但如果任一个实现了这样的非阻塞I/O就足够了;一个通常在启动另一个的进程中执行该工作,因为这是众所周知的必要程序(此类程序除外)。

关于python - Python中主进程和子进程之间的动态通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54060274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com