首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何输入PLINQ订单

如何输入PLINQ订单
EN

Stack Overflow用户
提问于 2012-12-01 03:27:09
回答 3查看 217关注 0票数 0

如果我在IEnumerable (列表)中有以下顺序:

1-2-3-4-5

如果我在上面运行一个PLINQ查询,比如:

代码语言:javascript
复制
list.AsParallel().AsOrdered().WithDegreeOfParallelism(10).Select(
                s => SomeDelegateFunction(s)).AsSequential().ToList();

对于上面的查询,我在日志中(在委托函数中)看到它使用了多个线程,但没有维护列表的处理顺序。然而,对于下面的查询,我维护了序列,但使用了一个线程来完成整个操作:

代码语言:javascript
复制
list.AsParallel().AsOrdered().WithDegreeOfParallelism(10).AsSequential().Select(
               s => SomeDelegateFunction(s)).ToList();

这两个查询之间的区别是第二个查询中的" AsSequential()“,我遇到的问题是,当我使用AsSequential()时:

1-为什么不使用多线程?它可以将工作分解为:

代码语言:javascript
复制
1 - 2 (Give it to thread 1)
3 - 4 - 5 (Give it to thread 2)

相反,它确实执行1-2-3-4-5(按该顺序),但它是在单个线程上执行的-为什么?

基本上,我需要按照列表作为输入的顺序来处理列表,但要在多个线程上进行。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-01 03:29:20

基本上,我需要按照列表作为输入的顺序来处理列表,但是需要在多个线程上。

这些都是互斥的需求。你可以选择其中的一个,但不能两个都做。

如果你不关心项目的处理顺序,你只需要确保你的最终结果是对象是它们第一次进入的顺序,因为你可以这样做:

代码语言:javascript
复制
var list = new List<int> { 1, 2, 3, 4, 5 };

Parallel.For(0, list.Count, i =>
{
    list[i] = Process(i);
});

如果你更喜欢PLINQ而不是Parallel.For,你可以这样做:

代码语言:javascript
复制
Enumerable.Range(0, list.Count)
    .AsParallel()
    .WithDegreeOfParallelism(10)
    .ForAll(i =>
    {
        list[i] = Process(i);
    });
票数 4
EN

Stack Overflow用户

发布于 2012-12-01 04:42:09

回答你的第一个问题

为什么不使用多线程?

那就是AsSequential()做的和AsParallel()做的完全相反。AsParallel()在一个有序的可枚举IEnumerable<T>上生成一个ParallelQuery<T>,以允许在多个线程中并行执行。AsSequential()用于将并行执行的结果合并到一个可枚举的回调用方线程中。

回答你的第二个问题

它可以将工作分解为:

代码语言:javascript
复制
1 - 2 (Give it to thread 1)
3 - 4 - 5 (Give it to thread 2)

是的,它可以,但是在并行执行这个序列的情况下,3可能会比1更早处理,并且它不会是顺序执行。

然而,您可以显式地控制PLINQ如何将序列分解为多个分区。因此,您可以控制数据在多个线程之间的分布方式(请参阅Custom Partitioners for PLINQ

票数 1
EN

Stack Overflow用户

发布于 2012-12-01 03:47:00

多线程生产者-消费者模式将允许您确保以相同的顺序处理项,同时允许并发处理项。但是,如果您需要确保每个项目的处理在下一个项目的处理开始之前完成,那么,正如Servy所说的那样,您就不走运了。

在生产者-消费者模式中,为了维护秩序,您可以使用线程安全队列。一个或多个生产者线程将待处理的项排入队列;在这种情况下,您将让一个生产者按顺序将列表中的项传递到队列。然后,多个使用者线程可以将这些项出队,这将按顺序进行。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Producer-consumer_problem

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13651796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档