PoolProcessExecutor 和子进程 Python

Posted

技术标签:

【中文标题】PoolProcessExecutor 和子进程 Python【英文标题】:PoolProcessExecutor and Subprocess Python 【发布时间】:2021-11-01 06:01:43 【问题描述】:

问题

我正在尝试生成客户端服务器异步通信。换句话说,我有一个与客户端一起运行的批处理文件,该客户端处理运行并与客户端通信。我正在使用PoolProcessExecutor 调用客户端和批处理。启动客户端后,该进程将停止运行。

代码如下所示:

批处理文件:
 def subprocess_function():
        p = Popen(scriptPath, cwd=filepath)
        stdout, stderr = p.communicate()
驱动文件
for episode in range(n_episodes):
    print(f"\r\n'-' * 60\r\n")
    with concurrent.futures.ProcessPoolExecutor() as executor:
        client = CustomClient("tcp://127.0.0.1:5556", "tcp://127.0.0.1:5555")
        sub_proc = executor.submit(subprocess_function)
        client_proc = executor.submit(client.Start(agent, buffer))

问题

当我尝试将 subprocess_function 转换为我将进程分配给变量的类时,我相信它会导致代码在继续启动下一个进程之前等待分配,但我不是 100% 确定。

我需要改用ThreadPoolProcessor吗?

【问题讨论】:

【参考方案1】:

这里的问题是,当您离开 with 块以完成提交的工作时,ProcessPoolExecutor 会阻塞。您需要通勤 withfor 块。此外,您似乎在主线程中调用client.Start,这也可能是一个问题。相反,您只想将该方法及其参数传递给子进程。

with concurrent.futures.ProcessPoolExecutor() as executor:
    for episode in range(n_episodes):
        print(f"\r\n'-' * 60\r\n")
        client = CustomClient("tcp://127.0.0.1:5556", "tcp://127.0.0.1:5555")
        sub_proc = executor.submit(subprocess_function)
        client_proc = executor.submit(client.Start, agent, buffer)

请参阅在 with 块末尾调用的 Executor.shutdown method 的文档。

【讨论】:

如果尝试创建一个类而不是一个函数会怎样,所以现在 subprocess_function 现在是一个方法,即通过执行 class= SubProc.start() 来调用它。这似乎导致它挂起,我会在withfor 循环之前声明这个类吗? 你是说你的问题是executor.submit(client.Start(agent, buffer))这行吗?如果是这样,问题是您不想调用 client start 作为submit 的参数,您只想提交它。你可能想要executor.submit(client.Start, agent, buffer)。这里我们避免在主进程中调用client.Start。我们只需将函数和参数传递给子进程,子进程就会调用函数。

以上是关于PoolProcessExecutor 和子进程 Python的主要内容,如果未能解决你的问题,请参考以下文章

什么是父进程和子进程?

多进程和子进程有啥区别?

父进程和子进程关系

在 C++ 中父进程和子进程之间共享队列

父进程和子进程

父进程和子进程