为啥多处理不能并行工作? [复制]
Posted
技术标签:
【中文标题】为啥多处理不能并行工作? [复制]【英文标题】:why multiprocessing isn't working in parallel? [duplicate]为什么多处理不能并行工作? [复制] 【发布时间】:2022-01-09 18:20:57 【问题描述】:我正在尝试使用 4 个不同的输入并行执行相同的功能。 它在总输入小于 10^5 时起作用,但当它变大时它开始同时工作。
def subList_process(instance):
print("start")
l = List(dataSet=instance)
l.shuffle_set()
l.sort_set()
print("done")
if __name__ == '__main__':
p=[]
p.append(multiprocessing.Process(target=subList_process,args=(lists[0],)))
p.append(multiprocessing.Process(target=subList_process,args=(lists[1],)))
p.append(multiprocessing.Process(target=subList_process,args=(lists[2],)))
p.append(multiprocessing.Process(target=subList_process,args=(lists[3],)))
for process in p : process.start()
for process in p : process.join()
这是具有两种不同数据大小的输出:
10^4 10^6我能否解释一下当数据量相对较大时发生了什么? 我该如何解决?
【问题讨论】:
Python 必须将args
复制到子进程,这是按顺序发生的。随着args
变得足够大,复制数据所需的时间比排序数据要长。
@MisterMiyagi 你知道我该如何解决吗?
@mahmoudkassab 生成/读取每个进程内的数据,仅传递例如要读取的文件名
【参考方案1】:
多处理需要序列化(即pickle)主进程中的参数并将其发送到子进程。由于您的并行化函数非常快,因此该函数在下一组输入参数被序列化之前就完成了。
编辑:回复您的评论 没有很好的方法来解决这个问题,但这里有一些替代方法:
尝试传递有关如何创建参数而不是参数本身的说明。例如,如果您的输入是使用创建者函数生成的,那么只需在子流程中调用创建者函数即可。 如果您只创建一次并且相对频繁地读取它们,请将它们存储在磁盘上。特别是如果您有 SSD 驱动器,您可以从子进程中的磁盘读取参数(例如,以 pickle 文件的形式)。这可能会更快。【讨论】:
谢谢。我将数据写入文本文件并将文件名作为参数发送给目标函数,它们现在并行工作。以上是关于为啥多处理不能并行工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章