问题标签 [parallel-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1272 浏览

c# - 如何使用并行扩展在低优先级线程上串行处理排队的项目

我想知道使用.NET 4.0 Parallel Extensions在低优先级线程上串行处理长时间运行进程结果的最佳方法。

我有以下类既执行执行又提供结果:

在处理完这些步骤后,如何按顺序将它们保存到文件中?我想在RemotedService.DoSomeStuff()等待服务器响应时将它们保存到文件中。

写入文件将如下所示:

想到的一个选择是将它们添加到 aQueue并让 aTimer处理它们。但这并没有利用远程调用的停机时间。

想到的另一个选择是使用System.Threading.Tasks.Taskper将每个结果异步写入文件Step,但这并不能保证它们会按顺序保存,并且还可能会引入写入文件的争用。

0 投票
1 回答
4531 浏览

c#-4.0 - 并行蛮力算法

因此,我查看了http://codahale.com/how-to-safely-store-a-password/#并开始好奇在一台功能强大的台式计算机上可以多快地强制执行不同的哈希,并很想对其进行测试

虽然我见过的大多数算法都是单线程的,但让我感到震惊的是,在使用 c# 4.0 Parallel.net/Plinq 扩展和并发结构(如 ConcurrentBag 和 IProducerConsumer)时,这将是一个非常有趣的挑战。

所以我的任务如下,使用并行化构建 n 长度和 charset[x] 密码的最有效/性能最强大的暴力检查器,即生成给定字符集和长度的所有可能字符串,直到找到匹配项。假设至少有两个核心和合理数量的内存

我要自己试一试,让最好的男人/女人赢:)

编辑

第一次尝试没有比较性能和有限的范围和已知的密码长度

下一次尝试

使用 ParallelEnumerable 并不聪明,因为它的大小仅限于 int,您很快就需要至少很长时间,即使我怀疑这会让您长时间使用大密码字符集。猜猜你要么必须去 BigInt 要么在那之后开始以某种方式分解它。

0 投票
5 回答
902 浏览

java - Java 并行编程

我需要在我的多核桌面上并行化 CPU 密集型 Java 应用程序,但我对线程编程不太满意。我研究了 Scala,但这意味着学习一门新语言,这真的很耗时。我还查看了 Ateji PX Java 并行扩展,这些扩展看起来很容易使用,但还没有机会对其进行评估。有人会推荐它吗?欢迎提出其他建议。

在此先感谢您的帮助

账单

0 投票
2 回答
4619 浏览

c# - CorrelationManager.LogicalOperationStack 是否与 Parallel.For、Tasks、Threads 等兼容

有关背景信息,请参阅此问题:

任务并行库中的任务如何影响 ActivityID?

该问题询问 Tasks 如何影响Trace.CorrelationManager.ActivityId。@Greg Samson 用一个测试程序回答了他自己的问题,表明 ActivityId 在任务上下文中是可靠的。测试程序在Task委托的开头设置一个ActivityId,休眠模拟工作,然后在最后检查ActivityId以确保它是相同的值(即它没有被另一个线程修改)。程序运行成功。

在研究线程、任务和并行操作的其他“上下文”选项(最终为日志记录提供更好的上下文)时,我遇到了Trace.CorrelationManager.LogicalOperationStack的一个奇怪问题(无论如何这对我来说很奇怪)。我已经在下面复制了我对他的问题的“答案”。

我认为它充分描述了我遇到的问题(在 Parallel.For 的上下文中使用时,Trace.CorrelationManager.LogicalOperationStack 显然已损坏 - 或其他东西,但前提是 Parallel.For 本身包含在逻辑操作中) .

以下是我的问题:

  1. Trace.CorrelationManager.LogicalOperationStack 是否可以与 Parallel.For 一起使用?如果是这样,如果逻辑操作已经在 Parallel.For 启动时生效,是否会有所不同?

  2. 是否有一种“正确”的方式将 LogicalOperationStack 与 Parallel.For 一起使用?我可以对这个示例程序进行不同的编码以使其“工作”吗?通过“作品”,我的意思是 LogicalOperationStack 始终具有预期的条目数,并且条目本身就是预期的条目。

我已经使用 Threads 和 ThreadPool 线程进行了一些额外的测试,但我必须返回并重试这些测试,看看我是否遇到了类似的问题。

我会说,似乎任务/并行线程和线程池线程确实从父线程“继承”了 Trace.CorrelationManager.ActivityId 和 Trace.CorrelationManager.LogicalOperationStack 值。这是意料之中的,因为这些值是由 CorrelationManager 使用CallContext的 LogicalSetData 方法(而不是 SetData)存储的。

再次,请参考这个问题以获取我在下面发布的“答案”的原始上下文:

任务并行库中的任务如何影响 ActivityID?

另请参阅 Microsoft 的 Parallel Extensions 论坛上的类似问题(迄今为止尚未回答):

http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/7c5c3051-133b-4814-9db0-fc0039b4f9d9

[开始粘贴]

请原谅我将其发布为答案,因为它并不能真正回答您的问题,但是,它与您的问题有关,因为它涉及 CorrelationManager 行为和线程/任务/等。我一直在研究使用 CorrelationManager 的LogicalOperationStack(和StartLogicalOperation/StopLogicalOperation方法)在多线程场景中提供额外的上下文。

我以您的示例为例并对其进行了一些修改,以添加使用 Parallel.For 并行执行工作的能力。另外,我使用StartLogicalOperation/StopLogicalOperation括号(内部)DoLongRunningWork。从概念上讲,DoLongRunningWork每次执行时都会执行以下操作:

我发现,如果我将这些逻辑操作添加到您的代码中(或多或少),所有逻辑操作都保持同步(堆栈上的预期操作数和堆栈上的操作值始终为预期的)。

在我自己的一些测试中,我发现情况并非总是如此。逻辑操作堆栈正在“损坏”。我能想出的最好解释是,当“子”线程退出时,将 CallContext 信息“合并”到“父”线程上下文中导致“旧”子线程上下文信息(逻辑操作)为“由另一个同级子线程继承”。

问题也可能与 Parallel.For 显然使用主线程(至少在示例代码中,如所写)作为“工作线程”之一(或在并行域中应该调用的任何线程)这一事实有关。每当执行 DoLongRunningWork 时,都会启动一个新的逻辑操作(在开始时)并停止(在结束时)(即,推入 LogicalOperationStack 并从中弹出)。如果主线程已经有一个有效的逻辑操作,并且如果 DoLongRunningWork 在主线程上执行,则启动一个新的逻辑操作,因此主线程的 LogicalOperationStack 现在有两个操作。DoLongRunningWork 的任何后续执行(只要 DoLongRunningWork 的这种“迭代”在主线程上执行)将(显然)继承主线程'

我花了很长时间才弄清楚为什么我的示例中的 LogicalOperationStack 的行为与您的示例的修改版本不同。最后我看到,在我的代码中,我将整个程序括在一个逻辑操作中,而在我修改过的测试程序版本中,我没有。这意味着在我的测试程序中,每次执行我的“工作”(类似于 DoLongRunningWork),已经有一个有效的逻辑操作。在您的测试程序的修改版本中,我没有将整个程序括在逻辑操作中。

因此,当我修改您的测试程序以将整个程序括在逻辑操作中并且如果我使用 Parallel.For 时,我遇到了完全相同的问题。

使用上面的概念模型,这将成功运行:

虽然这最终会因为 LogicalOperationStack 明显不同步而断言:

这是我的示例程序。它与您的相似之处在于它具有操作 ActivityId 和 LogicalOperationStack 的 DoLongRunningWork 方法。我也有两种风格的 DoLongRunningWork。一种使用Tasks,一种使用Parallel.For。也可以执行每种风格,以使整个并行化操作包含在逻辑操作中或不包含在逻辑操作中。因此,总共有 4 种方式来执行并行操作。要尝试每一个,只需取消注释所需的“使用...”方法,重新编译并运行。 UseTasks, UseTasks(true), 并且UseParallelFor应该都运行完成。 UseParallelFor(true)将在某个时候断言,因为 LogicalOperationStack 没有预期的条目数。

LogicalOperationStack 是否可以与 Parallel.For (和/或其他线程/任务构造)一起使用或如何使用它的整个问题可能值得自己提出问题。也许我会发布一个问题。同时,我想知道您对此是否有任何想法(或者,我想知道您是否考虑过使用 LogicalOperationStack,因为 ActivityId 似乎是安全的)。

[结束粘贴]

有人对这个问题有任何想法吗?

0 投票
2 回答
3048 浏览

c# - 使用 Parallel.ForEach 时如何发送进度

我计划在 DataTable 上使用 Parallel.ForEach,以便可以将每条记录写入文件。

我们如何通知用户已处理记录的百分比/数量。

通常,当我们使用后台工作者时,我们会有一个 ProgressChanged 事件,在该事件中通知用户已完成工作的百分比。我们如何使用 Parallel.ForEach 或 Multiple 任务来实现这一点?

谢谢,兔子

0 投票
2 回答
840 浏览

c# - 将并行扩展或并行 LINQ 与 LINQ Take 结合使用

我有一个包含大约 500 万行的数据库。我正在尝试为数据库生成 XML 字符串并将它们推送到服务。该服务支持一次获取 1000 条记录,而不是一次执行此操作。目前,这很慢,每 1000 条记录需要 10 秒以上的时间(包括写回数据库和上传到服务)。

我试图让以下代码工作,但失败了......我尝试它时崩溃了。有任何想法吗?

我收到一个崩溃,告诉我索引超出范围。如果left是 500 万,则循环中的数字应该不超过 5000。如果我再乘以 1000,我应该不会超过 500 万。我不介意它是否工作了一点,然后失败了,但它只是在 SQL 查询之后失败了!

0 投票
2 回答
905 浏览

c# - 从 Parallel.For 获取结果

我正在考虑使用Parallel.For来调用一个需要一段时间才能返回的 Web 服务,但是,我们知道我们可以同时调用它很多次,而且它不会比一次调用花费更长的时间。

为此,我正在尝试 Parallel.For,我真的很想了解一下我的想法,看看它是如何工作的。我可能有点过于谨慎,因为我不想搞砸应用程序,并且我想确保如果我们走这条路,整个应用程序团队都知道在访问并行代码时需要做什么。

无论如何,这是我目前的工作和理解。

AvailService获取指定日期范围 ( startDate+ numNights)的房间可用性。code是属性的标识符。

我在开始时设置了一个正确大小的结果数组,其中有很多空槽。

然后我并行调用该服务。该服务创建了一个新HotelAvail对象,我将它放在数组中的正确位置。

一切完成后,我返回数组。此时它应该已完全填充。不应该有空格。该服务不会影响系统状态的任何其他部分——它只是构建一个 Web 服务调用,调用它,然后返回一个结果对象。

是否有任何我没有看到的问题。

就像我上面所说的,我可能过于谨慎了,但是我在更年轻和更旺盛的日子里被编写多线程代码所烧毁,我不想再犯同样的错误。

此外,此代码最终会出现在 ASP.NET 应用程序中。我依稀记得它对多线程代码的抱怨很多。我可能会在那里遇到任何其他问题?

0 投票
2 回答
3113 浏览

c# - 多级 ConcurrentDictionary 仍然是线程安全的吗?

我有这样定义的四级数据结构:

整个事情都封装在一个类中,该类也维护线程安全。目前它只是在读取/操作数据时锁定整个集合(读取比写入更常见的数量级)。

我正在考虑替换DictionarywithConcurrentDictionaryListwith ConcurrentBag(它的项目不必订购)。

如果我这样做,我可以消除锁并确保并发集合能够正确完成它们的工作吗?

0 投票
4 回答
144050 浏览

c# - Parallel.ForEach 与 Task.Factory.StartNew

下面的代码片段有什么区别?两者都不会使用线程池线程吗?

例如,如果我想为集合中的每个项目调用一个函数,

0 投票
6 回答
16332 浏览

c# - 列表线程安全

我正在使用下面的代码

上面的代码线程安全吗?处理列表是否有可能损坏?或者我应该在添加之前使用锁吗?

谢谢。