恢复传递给 multiprocessing.Process 的函数的 return 值的最快方法

Fastest way to recover the return value of a function passed to multiprocessing.Process

我有一个繁重的批处理工作,所以我将它分成 30 个(我的 CPU 数量)小批次,我做了 30 个 multiprocessing.Process 来完成它们(出于某种原因我没有使用 multiprocessing.Pool ).对于 return 值,我使用了 30 multiprocessing.Queue。这是我的代码的概述:

    def minibatch(q, data, i):
        do_some_work_data_i
        q.put(return_value)

    if __name__ == '__main__':
        q1 = Queue()
        p1 = Process(target=minibatch, args=(q1, data[1], 1))
        p1.start()

        q2 = Queue()
        p2 = Process(target=minibatch, args=(q2, data[2], 2))
        p2.start()

        first_return_value = q1.get()
        second_return_value = q2.get()

        p1.join()
        p2.join()

现在,我发现它太慢了!如果每个小批量需要 10 秒,我预计我的代码需要大约 10 秒才能 运行 但它需要更多。那么我应该怎么做呢?

运行时顺序

processing time * number of runs

运行时并行

(processing time) * (number of runs / number of parallel processes) 
+ (process start overhead * number parallel processes) 

如果您的处理时间一开始并不长,那么创建新进程的开销将超过您从并行性中获得的节省。

如果您的顺序批处理需要大约 300 秒,那么您的并行实施可能只需要 <11 秒,但如果您的顺序批处理只需要 10 秒,那么 运行 它在 30 个进程上实际上可能需要更长的时间.