是否有一种模式可以将并行与并行上的线程安全计算相结合?
需要计算一个结果,其中第一步将受益于并行,第二个是对并行结果的串行过程。
一种选择是并行运行并将输出保存到一个集合中,然后串行处理该集合,我就可以工作了。存在内存管理的问题,因为集合可能非常大。
下面是串行版本。基本上我想并行 TableQueryGetRowKeys 并以线程安全的方式使用该结果。尝试仅并行化 for 并锁定最终结果,但 rowKeys 可能已关闭。尝试过聚合,但我无法弄清楚如何将集合传递给聚合,更不用说在聚合中执行线程安全的相交了。
IEnumerable<string> finalResults = null;
if (partitionKey.Length == 0) return finalResults;
object lockObject = new object();
finalResults = TableQueryGetRowKeys(partitionKey[0], 0);
HashSet<string> rowKeys;
for(int i = 1; i < partitionKey.Length; i++)
{
// IO operation to Azure Table Storage against the PartitionKey
// so very amenable to parallel
rowKeys = TableQueryGetRowKeys(partitionKey[i]);
// a memory and CPU operation
// this should be much faster than TableQueryGetRowKeys
// going parallel and wrapping this in a lock did not properly synch rowKeys
finalResults = finalResults.Intersect(rowKeys);
}
return finalResults;