【问题标题】:Subprocesses don't run in parrallel - Multiprocessing Python子进程不并行运行 - 多处理 Python
【发布时间】:2022-01-25 19:53:17
【问题描述】:

我尝试了很多方法来调用我的子进程来同时运行它们。它会创建所有进程,但一次只运行一个。

我的 3 个进程通过套接字(multiprocessing.connection.Listener / Client)与我的主进程通信。不同的进程各自读取不同的文件,所以应该没有 I/O 麻烦。

这里有我尝试过的所有东西:

1.

pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply_async(run, args=())
    sleep(0.2)
    j += 1
pool.close()
j = 0
while j < procs:
    processes.append(Process(target=run, args=()))
    processes[-1].start()
    sleep(0.2)
    j += 1
pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply(run, args=())
    sleep(0.2)
    j += 1
pool.close()

提前感谢您的帮助

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:
    pool = Pool(cpu_count())
    

    没用,这是默认行为

    pool.apply_async(run, args=())
    sleep(0.2)
    

    这会提交 一个 任务,因为之后你正在睡觉,除非任务花费超过 200 毫秒(这不太可能,200 毫秒很多)所有提交将是顺序

    processes.append(Process(target=run, args=()))
    processes[-1].start()
    sleep(0.2)
    

    与上述相同,但可能更糟(不清楚start() 的阻塞行为是什么)。

    pool.apply(run, args=())
    sleep(0.2)
    

    apply 正在阻塞,因此这会将一项作业提交到队列并等待该作业完成

    只有第一个版本才有机会利用池,并且由于您在提交后要休眠 200 毫秒,因此该作业需要至少 200 毫秒才能被并行化。

    你根本没有解释run 做了什么,你只是说他们正在读取文件,但即使是入门级 SSD 也有 GB/s 级带宽,所以你需要读入至少数百 MB 的文件才能使这种效果变得合理(如果您使用非常低效的阅读方法,可能会更少)。

    使用进程池的正确方法是apply_async在一个紧密的循环中,或者使用map_asyncimap_unordered将作业批量发送到池中,让池在worker之间分配工作.

    还有

    不同的进程各自读取不同的文件

    当然没有任何迹象或证据,因为它们都在运行相同的 run 函数,没有参数。

    【讨论】:

    • 非常感谢您的回答。 Run 脚本将简单地读取某些文件并在这些不同的文件中搜索字符串。完成后,它将收集到的各种信息发送到主脚本。我确信这些进程不会读取相同的文件,因为它是主脚本,稍后会通知他们可以读取哪些文件。另外,我已经有机会调试这个以验证没有错误。我为我的错误道歉,我试图理解和学习这就是我提问的原因。
    • 小说明:我知道它们没有同时运行,因为它们都应该在自己创建服务器线程后向服务器发送消息。
    最近更新 更多