使用多处理解决方案实现 merge_sort

抽象程序

我试图用多处理解决方案编写合并排序

from heapq import merge
from multiprocessing import Process

def merge_sort1(m):
    if len(m) < 2:
        return m

    middle = len(m) // 2
    left = Process(target=merge_sort1, args=(m[:middle],))
    left.start()
    right = Process(target=merge_sort1, args=(m[middle:],))
    right.start()
    for p in (left, right):
        p.join()
    result = list(merge(left, right))
    return result

用 arr 测试一下

In [47]: arr = list(range(9))                                                                                   
In [48]: random.shuffle(arr)                                                                                    

它重新发布错误:

In [49]: merge_sort1(arr)                                                                                       
TypeError: 'Process' object is not iterable

我的代码有什么问题?

阿马丹

merge(left, right)尝试合并两个进程,而您可能想要合并每个进程产生的两个列表。注意传递给函数的返回值Process丢失了;这是一个不同的进程,而不仅仅是一个不同的线程,并且您不能很容易地将数据混洗回父级,因此默认情况下 Python 不会这样做。您需要明确并自己编写这样的频道。幸运的是,有multiprocessing数据类型可以帮助您;例如,multiprocessing.Pipe

from heapq import merge
import random
import multiprocessing

def merge_sort1(m, send_end=None):
    if len(m) < 2:
        result = m
    else:
        middle = len(m) // 2

        inputs = [m[:middle], m[middle:]]
        pipes = [multiprocessing.Pipe(False) for _ in inputs]
        processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
                    for input, (recv_end, send_end) in zip(inputs, pipes)]
        for process in processes: process.start()
        for process in processes: process.join()
        results = [recv_end.recv() for recv_end, send_end in pipes]

        result = list(merge(*results))

    if send_end:
        send_end.send(result)
    else:
        return result


arr = list(range(9))
random.shuffle(arr)

print(merge_sort1(arr))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我不明白merge_sort排序算法的递归实现和函数调用

merge_sort()中的merge()如何工作?

Merge_Sort算法的计数工作

使用多处理的数独解决方案

不推荐使用sort_by方法-可能的解决方案?

为什么我的C ++中的merge_sort无法正常工作?

Java中的自然语言处理解决方案?

任何惯用的生成/预处理解决方案库?

寻找更优雅的任务处理解决方案

ZeroMQ挂在python多处理类/对象解决方案中

带有多处理功能的python中IPC的优雅解决方案

使用理解力的nQueen的Scala解决方案

使用Python多处理解决令人尴尬的并行问题

使用Pandas Transform实现替代解决方案

如何使用RxJs实现分页解决方案?

在merge_sort算法中,当参数为双精度类型列表时有效,但当其为int类型列表时无效

如何记录 git merge 冲突及其解决方案但不自动解决冲突?

如何寻求列表理解解决方案?

对DP解决方案的硬币更改理解

难以理解递归关系解决方案

图形实现更优雅的解决方案?

实现收敛的迭代解决方案

有关simd图像处理解决方案的总体简要信息

从 if 语句转换为 Python 中 INSERTION SORT 的基于循环的高效解决方案

使用treeStore ExtJS时选择节点(代理解决方案)

SQL:如何在不使用rank()的情况下理解解决方案代码?

使用Modulo无法理解斐波那契解决方案

鉴于使用位掩码的解决方案,我无法理解代码中标记的条件评估

了解无需使用乘法运算符即可实现square()的解决方案