【问题标题】:PoolProcessExecutor and Subprocess PythonPoolProcessExecutor 和子进程 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吗?

【问题讨论】:

    标签: python multithreading multiprocessing subprocess python-asyncio


    【解决方案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。我们只需将函数和参数传递给子进程,子进程就会调用函数。
    猜你喜欢
    • 2010-10-30
    • 2012-01-10
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多