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

时间:2018-10-24 08:02:06

标签: python multiprocessing python-multiprocessing

我有一个繁重的批处理工作,所以我将其切成30个(CPU的数量)迷你批处理,我做了30个multiprocessing.Process来完成它们(由于某些原因,我没有使用multiprocessing.Pool)。对于返回值,我使用了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秒来运行,但是要花更多的时间。那我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

运行时顺序

processing time * number of runs

运行时并行

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

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

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