【问题标题】:Python Multiprocessing, passing files as deepcopies?Python多处理,将文件作为深拷贝传递?
【发布时间】:2017-06-22 20:50:46
【问题描述】:

我有一个非常可并行化的任务:给定一个 ID,在图形结构中查找它,查看它指向的 id 并计算它们值的平均值。

我正在使用 python 多处理来完成这项任务,我有一个名为 graph 的对象,它总结了我感兴趣的属性和层次结构。

以非常幼稚的方式使用 python 多处理:

processes = []

for i in range(10):
    currDataset = getOneTenthofDataset(fullDataset)
    process = multiprocessing.process(name='name', target=func1, args=(currDataset, graph))
    processes.append(process)
    process.start() 

for p in processes:              
     p.join()

def func1(dataset, graph):
    ...
    for each row of dataset query on graph, update current row accordingly
    save dataset to file (I don't need to return the splitted datasets!)

我发现计算时间几乎没有加速(我认为这可能是由于图形上的查询正在排队而不是并行完成?) 所以我做的是

def func2(dataset, graph):
    localGraph = copy.deepcopy(graph)
    .. same code as func1 ..

这导致了一个神秘而奇怪的错误!事实上,并不是所有的过程都正确结束,但只有 1/3 到 1/2 的过程,并且每次不同的过程都正确结束。避免使用 deepcopy,而是一切正常。 另一个奇怪的行为是,没有到达最后的进程不会抛出任何错误,它们只是停止执行并且不会转到 deepcopy 之后的指令! 最后,程序没有任何错误就终止了

【问题讨论】:

  • 您使用的是 Windows 还是类 unix 系统?
  • Unix:Ubuntu 16.10

标签: python multiprocessing deep-copy


【解决方案1】:

multiprocessing 需要序列化/反序列化您传递给函数的任何参数。如果您的数据集很大,那将是昂贵的。在分叉系统上(不是 Windows!),您可以利用子进程获取父内存的写入时复制视图并跳过复制的事实。将fullDatasetgraph 放在func1 可以在不作为参数传递的情况下找到它的地方,例如模块的global 命名空间。由于您的示例代码已经在模块级别,我假设您已经这样做了。将getOneTenthOfDataset 替换为getDatasetSlice(当然是我自己编的),你就可以开始了。

processes = []

for i in range(10):
    process = multiprocessing.process(name='name', target=func1, args=(i,))
    processes.append(process)
    process.start() 

for p in processes:              
     p.join()

def func1(i):
    dataset = getDatasetSlice(i)
    graph # Its already in module namespace
    ....
    for each row of dataset query on graph, update current row accordingly
    save dataset to file (I don't need to return the splitted datasets!)

【讨论】:

  • 我仍然不明白为什么 deepcopy 失败并且没有抛出任何错误,但这完全解决了我的问题,很高兴知道!
猜你喜欢
  • 2011-08-24
  • 2012-02-20
  • 1970-01-01
  • 2012-05-26
  • 2015-01-13
  • 2019-01-22
  • 2017-10-14
  • 2012-04-12
  • 2010-10-24
相关资源
最近更新 更多