我有一个非常可行的任务:给定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之后不要转到指令!最后,程序终止而没有任何错误
multiprocessing
需要序列化/对您传递给该功能的任何参数。如果您的数据集很大,那将是昂贵的。在分叉系统(而不是Windows!(上,您可以利用子过程获得父母内存的复制视图并跳过副本的事实。将fullDataset
和graph
放置在func1
可以找到它的地方,而不会将其作为参数传递,例如模块的global
名称空间。由于您的示例代码已经在模块级别,因此我假设您已经完成了。用getDatasetSlice
替换getOneTenthOfDataset
(我当然刚刚做出了(,您很高兴去。
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!)