В предисловии к 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, а второй говорит, что он быстрее, когда обработка может быть распараллелена.Это звучит для меня то же самое.В моем коде он в настоящее время выполняется столько же времени, но мне интересно, есть ли другой случай, который я не понимаю.