Tag: parallel processing

Parallel.For和Break()误会?

我正在研究For循环中的Parallelism Break。 阅读本文后 ,我仍然有一个问题: 我希望这段代码: Parallel.For(0, 10, (i,state) => { Console.WriteLine(i); if (i == 5) state.Break(); } 最多产生 6个数字(0..6)。 他不仅没有这样做,而且结果长度不同: 02351486 013542 0135642 很烦人。 (这里的地狱是Break(){5之后}这里??) 所以我看了msdn Break可以用于与循环通信,在当前迭代之后不需要运行其他迭代。 如果从for循环的第100次迭代调用Break从0到1000并行迭代,则仍应运行小于100的所有迭代,但不需要从101到1000的迭代。 问题#1: 哪个迭代? 整个迭代计数器? 还是每个线程? 我很确定这是每个post。 请批准。 问题2 : 让我们假设我们使用并行+范围分区(由于元素之间没有cpu成本变化),因此它在线程之间划分数据。 所以如果我们有4个核心(并且它们之间有完美的划分): core #1 got 0..250 core #2 got 251..500 core #3 got 501..750 core #4 got 751..1000 所以core […]

使用Parallel Linq Extensions结合两个序列,如何才能首先产生最快的结果?

假设我有两个序列返回整数1到5。 第一个返回1,2和3非常快,但4和5每个需要200毫秒。 public static IEnumerable FastFirst() { for (int i = 1; i 3) Thread.Sleep(200); yield return i; } } 第二个返回1,2和3,延迟时间为200ms,但快速返回4和5。 public static IEnumerable SlowFirst() { for (int i = 1; i < 6; i++) { if (i < 4) Thread.Sleep(200); yield return i; } } 联合这两个序列只给出数字1到5。 FastFirst().Union(SlowFirst()); 我不能保证两种方法中的哪一种在什么时候有延迟,所以执行的顺序不能保证为我提供解决方案。 因此,我想并行化联盟,以便最小化我的例子中的(人为的)延迟。 一个真实场景:我有一个返回一些实体的缓存,以及一个返回所有实体的数据源。 我希望能够从一个方法返回一个迭代器,该方法将请求内部并行化到缓存和数据源,以便缓存的结果尽可能快地生成。 注1:我意识到这仍然在浪费CPU周期; 我不是在问我如何防止序列迭代它们的慢元素,我怎么能尽可能快地将它们联合起来。 更新1:我已经定制了achitaka-san对接受多个生成器的响应,并使用ContinueWhenAll将BlockingCollection的CompleteAdding设置为一次。 […]

c#中的并行和工作分工?

(假设我有10个核心) 我写的时候: Parallel.For(0, 100, (i,state) => { Console.WriteLine(i); }); 问题: 为每个核心分配数量的公式是什么? (是100/10 ?) 在执行点,每个核心是否已经知道要处理哪些数字? 或者每次从[0..100]存储库中获取新数字时是否消耗(让我们暂时忽略块或范围)? i参数 – 它是指0..100索引还是每个线程中的相对索引及其“处理”数字?

Parallel.Foreach vs Foreach和Task in local variable

当我们使用foreach和Tasks我们需要使用这样的局部变量: List TaskPool = new List(); foreach (TargetType Item in Source) { TargetType localItem = Item; TaskPool.Add(Task.Factory.StartNew(() => DoSomething(localItem))); } Task.WaitAll(TaskPool.ToArray()); 但是Parallel.Foreach怎么样,我这样使用它: Parallel.ForEach(Source, (TargetType item) => DoSomething(item)); 所以你看不到任何局部变量。 但是Parallel.Foreach如何工作? 是否没有必要引入任何局部变量? 或者如果需要,我该如何定义它? UPDATE .NET 4和.NET 4.5有什么区别吗?

使用Reactive以并行方式运行方法

晕到那里,我一直在寻找RX框架的解决方案。 我的C#4.0类将调用2种不同的方法并节省时间,我想并行执行。 有没有办法使用Reactive Framework并行运行2种不同的方法? 不仅要并行运行这两个方法,还要等待其他方法完成并合并两个结果。 示例如下图所示: AccountClass ac = new AccountClass(); string val1 = ac.Method1(); bool val2 = ac.Method2(); 如何运行这两个方法并行运行并相互等待完成并在Subscription部分中将结果组合在一起?

任务并行不稳定,有时使用100%CPU

我目前正在测试Parallel for C#。 通常它工作正常,使用并行比正常的foreach循环更快。 但是,有时(如5次中的1次),我的CPU将达到100%的使用率,导致并行任务非常慢。 我的CPU设置为i5-4570,内存为8gb。 有谁知道为什么会出现这个问题? 下面是我用来测试函数的代码 // Using normal foreach ConcurrentBag resultData = new ConcurrentBag(); Stopwatch sw = new Stopwatch(); sw.Start(); foreach (var item in testData) { if (item.Equals(1)) { resultData.Add(item); } } Console.WriteLine(“Normal ForEach ” + sw.ElapsedMilliseconds); // Using list parallel for resultData = new ConcurrentBag(); sw.Restart(); System.Threading.Tasks.Parallel.For(0, testData.Count() – 1, (i, […]

C#中的并行树遍历

我需要快速遍历一棵树,我想并行完成。 我宁愿使用并行扩展而不是手动旋转一堆线程。 我当前的代码看起来像这样: public void Traverse(Node root) { var nodeQueue = new Queue(); nodeQueue.Enqueue(root); while (nodeQueue.Count!=0) { var node = nodeQueue.Dequeue(); if (node.Property = someValue) DoSomething(node); foreach (var node in node.Children) { nodeQueue.Enqueue(node); } } } 我真的希望Parallel.ForEach有一个Parallel.While模拟。 我遇到了Stephen Toub关于使用Parallel.ForEach实现并行的文章。 如果正确读取它仍然无法工作,因为我正在改变我试图迭代的队列。 我是否需要使用任务工厂和递归(这有风险吗?)? 还是有一些我忽略的简单解决方案? 编辑:@svick 该树有超过250,000个节点。 现在最大深度是14个节点,包括根。 根目录下有大约500个节点,之后的平衡具有相当随机的分布。 我很快就会得到更好的分布统计数据。 @Enigmativity: 是的,许多用户同时修改了树,但我通常会为树或子树提供共​​享读锁,或允许脏读。 对node.Children的调用可以被认为是primefaces的。 DoSomething实际上是几个代理之一,对于一些昂贵的操作,我可能会收集节点的快照列表并在遍历之外处理它们。 我意识到我应该看一般情况(遍历的子树而不是整个树。)为此,我在树的每个节点上运行遍历并查看总时间。 我为每个遍历算法使用了Parallel.ForEach(nodes,Traverse),其中节点包含所有~250k节点。 这模拟(某种程度上)许多用户同时请求许多不同的节点。 00256ms宽度优先顺序 […]

.Net中可用的并行技术

我是.Net平台的新手。 我做了一个搜索,发现有几种方法可以在.Net中进行并行计算: 任务并行库中的并行任务,即.Net 3.5。 PLINQ,.Net 4.0 Asynchounous Programming,.Net 2.0,(async主要用于执行I / O繁重的任务,F#有一个简洁的语法支持这个)。 我列出这个是因为在Mono中,似乎没有TPL或PLINQ。 因此,如果我需要编写跨平台并行程序,我可以使用async。 .Net线程。 没有版本限制。 您能否对这些做一些简短评论或在此列表中添加更多方法?

为什么这个并行代码比它的类似非并行版本慢?

我有以下代码(从LINQPad复制)。 显然,看起来我不理解TPL如何工作或代码是垃圾,为什么并行版本运行速度比非并行版本慢? for (int i = 0; i < 100; i++) { ParallelOptions ops = new ParallelOptions(); ops.MaxDegreeOfParallelism = Environment.ProcessorCount; var watch = Stopwatch.StartNew(); Parallel.ForEach(Enumerable.Range(1, 10000000), ops, x => { int y = x + 1; }); watch.Stop(); Console.WriteLine(“Parallel: {0}”, watch.Elapsed.TotalSeconds); watch = Stopwatch.StartNew(); foreach (var x in Enumerable.Range(1, 10000000)) { int y = x […]

Parallel.Foreach c#暂停和停止function?

什么是最有效的暂停和停止(在它结束之前)parallel.foreach的方法? Parallel.ForEach(list, (item) => { doStuff(item); });