我试图用多处理解决方案编写合并排序
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] 删除。
我来说两句