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
会阻塞。您需要通勤 with
和 for
块。此外,您似乎在主线程中调用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() 来调用它。这似乎导致它挂起,我会在with
和for
循环之前声明这个类吗?
你是说你的问题是executor.submit(client.Start(agent, buffer))
这行吗?如果是这样,问题是您不想调用 client start 作为submit
的参数,您只想提交它。你可能想要executor.submit(client.Start, agent, buffer)
。这里我们避免在主进程中调用client.Start
。我们只需将函数和参数传递给子进程,子进程就会调用函数。以上是关于PoolProcessExecutor 和子进程 Python的主要内容,如果未能解决你的问题,请参考以下文章