在intro to PLINQ中,文档似乎显示了两种从无序流程中获取数据的不同方式。在一种情况下,AsParallel可以与Unsorted和Select或SelectMany方法一起使用。 SelectMany说
将序列的每个元素并行投影到IEnumerable 并将结果序列展平为一个序列。
所以要从函数中获取返回列表,我这样称呼它:
def genGraph(node,constData):
#do something
return (constData+1,constData+2,constData+3)
newGraph = Graph.AsParallel().SelectMany(lambda node: genGraph(node,constData) ).ToList()
另一种方法是使用ForAll和添加的ConcurrentBag
,但不返回任何内容。
当不需要保存订单时,可以更快地执行查询,并且 当结果的处理本身可以并行化时,请使用 ForAll方法执行PLINQ查询。
def genGraph(node,constData,newGraph):
#do something
newGraph.Add(constData+1,constData+2,constData+3)
newGraph = Concurrent.ConcurrentBag[type((0,0,0))]()
Graph.AsParallel().ForAll(lambda node: genGraph(node,constData,newGraph) )
因此,第一个表示与IEnumerable并行投影,第二个表示可以并行处理。对我来说,这听起来也一样。在我的代码中,它目前也运行相同的时间,但是我想知道是否还有其他我不理解的情况。