基于多处理池的Python树生成无加速

2024-04-29 17:05:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python中使用多处理池实现二叉树的多线程构建。它的主要思想是有N个可用的硬件线程,在一定的级别上,我想在单独的线程中创建树的每个分支。不存在数据依赖关系,并且每个递归调用都对自己的数据起作用,因此不存在与数据争用相关的问题。我熟悉GIL约束,因此决定使用多处理池:

pool = Pool(processes=4)
tree = Tree.createTreeMT(points, pool, 2);

问题是我不能得到任何加速。创建树的函数如下所示:

^{pr2}$

我做错什么了吗?在标准Python2.7中有没有更好的方法来执行这些任务?在


Tags: 数据tree硬件关系分支级别线程思想
1条回答
网友
1楼 · 发布于 2024-04-29 17:05:11

apply_async返回一个AsyncResult对象,当主进程对它调用“get”函数时,它将阻塞,直到计算出结果为止。所以,你的主进程总是阻塞它所创建的每个子任务。因此,没有加速!在

一个选项是在apply-unasync中使用“callback”选项。因此,您将替换以下代码:

if(level == 0):
    if len(left_points) > 0:
        leftPointsResult = pool.apply_async(createTree, (left_points))
    if len(right_points) > 0:
        rightPointsResult = pool.apply_async(createTree, (right_points))

    if(leftPointsResult):
        tree.left = leftPointsResult.get()
    if(rightPointsResult):
        tree.right = rightPointsResult.get()

^{pr2}$

一旦结果准备好,就调用回调lambda函数。正如您在代码中看到的,当池进程计算结果时,您的树将被适当地并行填充。在

相关问题 更多 >