为啥多处理不能并行工作? [复制]

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 文件的形式)。这可能会更快。

【讨论】:

谢谢。我将数据写入文本文件并将文件名作为参数发送给目标函数,它们现在并行工作。

以上是关于为啥多处理不能并行工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当 Hangfire 并行处理多个作业时,为啥 MySQL InnoDB 会产生如此多的死锁?

多处理支持的并行循环不能嵌套在线程下面

为啥多处理工作者不能更改全局变量? [复制]

GPU是并行计算,CPU是串行计算?为啥这么说?

为啥这个函数不并行?

为啥并行多线程代码执行比顺序慢?