使用多处理解决方案实现合并排序



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

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))

最新更新