我想使用PLINQ在产品和类别之间执行内部联接。但是我不确定是否应该为这两个集合调用AsParallel方法。
// PLINQ - Option 1
jointTables = from c in Homework02.categories.AsParallel()
join p in Homework02.productList on c.Name equals p.Category
select new { Category = c, Product = p };
// PLINQ - Option 2
jointTables = from c in Homework02.categories.AsParallel()
join p in Homework02.productList.AsParallel() on c.Name equals p.Category
select new { Category = c, Product = p };
Run Code Online (Sandbox Code Playgroud) 我有一个MyClass类MyMethod.对于MyClass实例列表中的每个MyClass实例,我想调用MyMethod并让它们在单独的线程中运行.我正在使用.NET 4.0和Parallel扩展.
为什么PLINQ输出与顺序处理和Parallel.For循环不同
我想添加10,000,000个数字的平方根.以下是3个案例的代码:
顺序循环:
double sum = 0.0;
for(int i = 1;i<10000001;i++)
sum += Math.Sqrt(i);
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.717
现在使用Parallel.For循环:
object locker = new object();
double total ;
Parallel.For(1,10000001,
()=>0.0,
(i,state,local)=> local+Math.Sqrt(i),
(local)=>
{
lock(locker){ total += local; }
}
);
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.7199
现在使用PLINQ
double tot = ParallelEnumerable.Range(1, 10000000)
.Sum(i => Math.Sqrt(i));
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.72
为什么PLINQ输出和Parallel.For和Sequential for loop之间有区别?
parallel-processing parallel-extensions plinq task-parallel-library
基本上,我想要处理多个线程中的项目列表,而不是一次处理一个.我一次只想要有限数量的线程.这种方法有意义吗?使用全局变量进行线程计数是唯一的选择吗?(下面的伪代码)
foreach item in list
while thread_count >= thread_max
sleep
loop
start_thread item
thread_count++
next
function start_thread(item)
do_something_to item
thread_count--
end function
Run Code Online (Sandbox Code Playgroud) 是否有一个等同于TPL Parallel.Invoke的F#?到目前为止,我所遇到的只是任务工厂,用于显式任务控制,但我在分析它时遇到了问题.
我不确定我应该如何混合plinq和async-await.假设我有以下界面
public interface IDoSomething (
Task Do();
}
Run Code Online (Sandbox Code Playgroud)
我有一个列表,我想并行执行,并能够await完成所有这些.
public async Task DoAll(IDoSomething[] doers) {
//Execute all doers in parallel ideally using plinq and
//continue when all are complete
}
Run Code Online (Sandbox Code Playgroud)
怎么实现这个?我不知道如何从并行linq转到任务,反之亦然.
我对异常处理并不十分担心.理想情况下,第一个会触发并打破整个过程,因为我打算在出错时抛弃整个过程.
编辑:很多人都说Task.WaitAll.我知道这一点,但我的理解(除非有人能证明不是这样)是因为它不能主动将你的东西并行化到多个可用的处理器核心.我特别要问的是双重的 -
如果我await一个Task一个PLINQ行动中确实是摆脱由于日程安排一个新的线程有很多的优势的?
如果我doers.AsParallel().ForAll(async d => await d.Do())平均需要大约5秒钟,那么在此期间我怎么不旋转调用线程呢?
c# linq parallel-extensions task-parallel-library async-await
我一直在尝试使用Rx和可观察集合实现一个简单的生产者 - 消费者模式.我还需要能够轻松限制用户数量.我在并行扩展中看到过很多对LimitedConcurrencyLevelTaskScheduler的引用,但我似乎无法使用多个线程.
我想我做的很傻,所以我希望有人可以解释一下.在下面的单元测试中,我希望使用多个(2)线程来使用阻塞集合中的字符串.我究竟做错了什么?
[TestClass]
public class LimitedConcurrencyLevelTaskSchedulerTestscs
{
private ConcurrentBag<string> _testStrings = new ConcurrentBag<string>();
ConcurrentBag<int> _threadIds= new ConcurrentBag<int>();
[TestMethod]
public void WhenConsumingFromBlockingCollection_GivenLimitOfTwoThreads_TwoThreadsAreUsed()
{
// Setup the command queue for processing combinations
var commandQueue = new BlockingCollection<string>();
var taskFactory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(2));
var scheduler = new TaskPoolScheduler(taskFactory);
commandQueue.GetConsumingEnumerable()
.ToObservable(scheduler)
.Subscribe(Go, ex => { throw ex; });
var iterationCount = 100;
for (int i = 0; i < iterationCount; i++)
{
commandQueue.Add(string.Format("string {0}", i));
}
commandQueue.CompleteAdding();
while (!commandQueue.IsCompleted)
{
Thread.Sleep(100); …Run Code Online (Sandbox Code Playgroud) c# concurrency observablecollection parallel-extensions system.reactive
我需要在我的多核桌面上并行化CPU密集型Java应用程序,但我对线程编程不太满意.我看了Scala,但这意味着要学习一种非常耗时的新语言.我还看了Ateji PX Java并行扩展,看起来很容易使用,但还没有机会评估它.有人会推荐吗?欢迎其他建议.
在此先感谢您的帮助
法案
java parallel-processing multithreading multicore parallel-extensions