Python multiprocessing.Manager命名空间 - 性能下降?

时间:2017-03-14 00:44:47

标签: python python-multiprocessing

我正在使用Python多处理将任务拆分为多个进程。我的CPU有4个物理核心和8个虚拟核心。我希望在所有核心上100%利用,但是当使用4个子进程池时,我观察到1个核心上的100%和3个上的9%。因为我使用multiprocessing.Manager Namespace我想知道这是否是罪魁祸首。子进程只从共享命名空间读取(不写入)。也许共享的命名空间不允许并发读取访问 - 我是否需要以某种方式指定不应该进行锁定?

在我的实际代码中,共享的Namespace很大,包含大型列表和numpy数组,因此另一个原因可能是创建它所需的时间。共享命名空间是仅创建一次,还是每次创建新的子进程时都创建(假设命名空间中的数据没有更改)?

示例代码:

import multiprocessing
import worker
mgr = multiprocessing.Manager()
multiProcShared = mgr.Namespace()
multiProcShared.a = 25
multiProcShared.b = 40
multiProcShared.c = 10
pool = multiprocessing.Pool(4)
allResults = []
max = xrange(100)
for segmentNum in max:
    allResults.append(pool.apply_async(worker.worker, args=(multiProcShared, segmentNum)))

更新:我怀疑由于我将大数据传递给子进程,因此数据切换可能会有很大的开销。我认为数据被腌制然后打开了吗?如果是这样,那么python多处理性能会随着传递给子进程的数据大小而降低吗?这是根据数据是通过共享命名空间还是通过函数参数传递而改变的?

0 个答案:

没有答案