为什么多处理不能并行工作?
why multiprocessing isn't working in parallel?
我正在尝试使用 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
我可以解释当数据量相对较大时发生了什么吗?
我该如何解决?
Multiprocessing 需要序列化(即 pickle)主进程中的参数并将其发送到子进程。由于您的并行函数非常快,函数在下一组输入参数被序列化之前完成。
编辑:回复您的评论
没有解决此问题的好方法,但这里有一些替代方法:
- 尝试传输有关如何创建参数而不是参数本身的说明。例如,如果您的输入是使用创建者函数生成的,则也只需在子流程中调用创建者函数即可。
- 如果您只创建一次参数并相对频繁地读取它们,请将它们存储在磁盘上。特别是如果你有一个 SSD 驱动器,你可以在子进程中从磁盘读取参数(例如以泡菜文件的形式)。这可能会更快。
我正在尝试使用 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
我可以解释当数据量相对较大时发生了什么吗? 我该如何解决?
Multiprocessing 需要序列化(即 pickle)主进程中的参数并将其发送到子进程。由于您的并行函数非常快,函数在下一组输入参数被序列化之前完成。
编辑:回复您的评论 没有解决此问题的好方法,但这里有一些替代方法:
- 尝试传输有关如何创建参数而不是参数本身的说明。例如,如果您的输入是使用创建者函数生成的,则也只需在子流程中调用创建者函数即可。
- 如果您只创建一次参数并相对频繁地读取它们,请将它们存储在磁盘上。特别是如果你有一个 SSD 驱动器,你可以在子进程中从磁盘读取参数(例如以泡菜文件的形式)。这可能会更快。