恢复传递给 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 个进程上实际上可能需要更长的时间.
我有一个繁重的批处理工作,所以我将它分成 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 个进程上实际上可能需要更长的时间.