问题标签 [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.
c# - 实现并行无限循环的最佳方法是什么?
我已经习惯在 .Net 的并行扩展中使用 Parallel.For(),因为它是一种并行化代码的简单方法,无需手动启动和维护线程(这可能很繁琐)。我现在正在查看我希望并行化的无限循环(做某事直到我发出信号停止),没有一个参数免费的 Parallel.For() 重载可以做到这一点,所以想知道这里最好的方法是什么是。原则上我可以做类似的事情:
但我怀疑这可能不是工作分区逻辑处理的预期/有效模式(?)
另一种选择是:
但这似乎不优雅,也可能导致工作划分效率低下。
现在我的直觉是通过创建和维护我自己的线程来手动执行此操作,但我有兴趣获得一些反馈/意见。谢谢。
=== 更新 ===
我在接受的答案中使用文章中代码的简化版本(我已删除 ParallelOptions 参数)。这是代码...
一个示例用法是:
c# - 使用 PLINQ 时如何避免内存不足异常?
您好,感谢您的关注!
背景
我有一个需要大量时间或并行计算的计算任务。
具体来说,我需要遍历大约 50 个图像的列表,对它们进行 Base64 编码,然后计算每个新编码的项目与包含大约 2000 个 Base64 字符串编码图像的 XML 文件中的值之间的 Levenshtein 距离,以便在具有最小列的 XML 文件。与基准字符串的距离。
常规foreach
循环可以工作,但是太慢了,所以我选择使用 PLINQ 来利用我的 Core i7 多核处理器:
任务开始时非常出色,高速运行,但随后出现“内存不足”异常。
我正在使用 C#、.NET 4、Forms 应用程序。
问题
如何调整我的 PLINQ 代码,以免内存不足?
更新/示例代码
这是调用来启动 PLINQ 的方法foreach
:
. . .这是 Levenshtein 距离方法:
提前致谢!
c# - 使用并行库添加到列表时保证线程安全的正确方法
我遍历一个连接字符串数组,并在每个循环中提取一些信息并添加到列表中。现在,我想使用 Parallel 库使其成为多线程的,但我不确定该库是否保证写入列表是线程安全的,或者我是否需要使用锁定:
c# - 并行执行单个工作流实例
假设我有一个工作流程,我想并行执行多次:
我想知道,以这种方式执行它是否合法:
c# - MaxDegreeOfParallelism 有什么作用?
我正在使用 Parallel.ForEach 并且我正在做一些数据库更新,现在没有设置 MaxDegreeOfParallelism ,双核处理器机器会导致 sql 客户端超时,而其他四核处理器机器则不会超时。
现在我无法控制我的代码运行时可用的处理器内核类型,但是我可以使用 MaxDegreeOfParallelism 更改一些设置,这些设置可能会同时运行更少的操作并且不会导致超时?
我可以增加超时时间,但这不是一个好的解决方案,如果在较低的 CPU 上我可以同时处理更少的操作,那将减少 cpu 的负载。
好的,我也阅读了所有其他帖子和 MSDN,但是将 MaxDegreeOfParallelism 设置为较低的值会使我的四核机器受到影响吗?
例如,有没有办法做类似的事情,如果 CPU 有两个内核,那么使用 20,如果 CPU 有四个内核,那么使用 40?
c# - .net 并行和串行循环
我们想在我们的解决方案中围绕某些循环构建一个模式,这将允许它们根据因素串行或并行运行。下面是它的一般形式。
由于并发集合不与常规集合共享公共接口,因此我们需要某种适配器来编写通用代码。
特别是围绕addFunc
循环体中委托的使用,是否有任何事情最终会导致我们可能错过的长期问题?到目前为止它运行良好,但是....?
.net - MemoryBarriers 和并行扩展
使用并行扩展时是否需要关注 MemoryBarriers?
编辑 - 详细说明原始问题是开放式的:(@xanatos 的答案是我正在寻找的答案)
举一个具体的例子:假设我使用 Parallel.ForEach 并且每次迭代都设置类中属性的值(每次迭代都设置它自己的特定属性,没有两次迭代设置相同属性的值)。在调用 Parallel.ForEach 的同一线程上,我访问从 Parallel.ForEach 设置的属性。
c# - 如何使用任务并行库执行多个任务并在第一个任务之后返回以实际返回数据
我正在开发一个应用程序,在该应用程序中,尽快将数据返回到串行进程很重要,但可以有多个来源来获取该数据。同样,有时一个来源比另一个更快,但您不知道会是哪个来源。我正在使用 ContinueWhenAny(...).Wait() 等待第一个任务结束,以便继续并退出调用方法。但是,我需要先检查数据的有效性,然后才返回(或者如果所有任务都已完成并且它们都没有有效数据)。现在,如果这是首先完成的任务,我的代码甚至会返回无效数据。
有没有办法做类似“ContinueWhenAny”的事情,但只有当Task.Result满足某个条件时,否则等待下一个任务/等......直到最后一个任务完成?
同样,我需要确保在一个结果有效后,其他线程取消。这部分已经运行良好。
目前,我的代码看起来像这样(去掉了异常处理,只是细节):
有任何想法吗?我不想使用 ContinueWhenAll 因为如果第一次调用需要 2 秒,第二次需要 10 秒,如果第一次调用返回有效数据,我想在 2 秒内返回串行过程,否则等待 10 秒,希望result 有有效数据,只有在所有任务都完成并返回无效结果时才返回无效数据。
--------- 更新 ---- 感谢 zmbq 的好主意。更新的(工作)代码如下,满足我的所有要求。但是需要注意的是,此代码与前面代码之间的区别在于,如果没有任何任务产生有效结果,则此代码将返回 null 结果,而不是前面代码本身返回无效结果。更改此版本也不会很困难,但是出于我的目的,在这种情况下我完全满足于返回 null 。
c# - 任务并行库 - 自定义任务计划程序
我需要将 Web 服务请求发送到在线 api,并且我认为 Parallel Extensions 非常适合我的需求。
有问题的 Web 服务旨在被重复调用,但有一种机制,如果您每秒调用超过一定数量,就会向您收费。我显然想尽量减少我的费用,所以想知道是否有人见过可以满足以下要求的 TaskScheduler:
- 限制每个时间跨度安排的任务数。我猜如果请求的数量超过了这个限制,那么它需要丢弃任务或可能阻塞?(停止积压的任务)
- 检测相同的请求是否已经在要执行的调度程序中但尚未执行,如果是,则不将第二个任务排队,而是返回第一个任务。
人们是否觉得这些是任务调度程序应该处理的职责,还是我在找错树?如果您有其他选择,我愿意接受建议。
c# - 如何在 C# 中获取线程 ID
上面在我的代码中我使用 AsParallel().Any() 如何获取由该 AsParellel.Any() 生成的线程的线程 ID...