0

IEnumerable(リスト)に次の順序がある場合:

1-2-3-4-5

そして、これに対してPLINQクエリを実行すると、次のようになります。

list.AsParallel().AsOrdered().WithDegreeOfParallelism(10).Select(
                s => SomeDelegateFunction(s)).AsSequential().ToList();

上記のクエリの場合、ログ(デリゲート関数内)で複数のスレッドを使用していることがわかりますが、リストの処理順序は維持されていません。ただし、以下のクエリでは、シーケンスを維持しますが、単一のスレッドを使用して操作全体を実行します。

list.AsParallel().AsOrdered().WithDegreeOfParallelism(10).AsSequential().Select(
               s => SomeDelegateFunction(s)).ToList();

2つのクエリの違いは、2番目のクエリの「AsSequential()」です。私が持っていた質問は、AsSequential()を使用する場合です。

1-マルチスレッドを使用しないのはなぜですか?それは次のように作業を分解した可能性があります:

1 - 2 (Give it to thread 1)
3 - 4 - 5 (Give it to thread 2)

代わりに、1〜2〜3〜4〜5(この順序で)を実行しますが、単一のスレッドで実行します-なぜですか?

基本的に、リストを入力として受け取ったORDERで処理する必要がありますが、複数のスレッドで処理する必要があります。

何か案は ?

4

3 に答える 3

4

基本的に、リストを入力として受け取ったORDERで処理する必要がありますが、複数のスレッドで処理する必要があります。

これらは相互に排他的な要件です。どちらか一方を実行できますが、両方を実行することはできません。

アイテムがどのような順序で処理されたかを気にしない場合は、次のように、オブジェクトが最初に入った順序になっていることを確認する必要があります。

var list = new List<int> { 1, 2, 3, 4, 5 };

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

PLINQを優先するParallel.For場合は、次のようにすることができます。

Enumerable.Range(0, list.Count)
    .AsParallel()
    .WithDegreeOfParallelism(10)
    .ForAll(i =>
    {
        list[i] = Process(i);
    });
于 2012-11-30T19:29:19.850 に答える
1

最初の質問に答える

マルチスレッドを使用しないのはなぜですか?

何をするかは、何をAsSequential()するかとは正反対AsParallel()です。 複数のスレッドでの並列実行を可能にAsParallel()するためParallelQuery<T>に、序数を列挙可能にします。並列実行の結果を1つの列挙可能なものにマージして呼び出し元のスレッドに戻すために使用されます。IEnumerable<T>AsSequential()

2番目の質問に答える

それは次のように作業を分解した可能性があります:

1 - 2 (Give it to thread 1)
3 - 4 - 5 (Give it to thread 2)

はい、可能ですが、このシーケンスを並列実行する場合、3はおそらく1より前に処理され、順次実行にはなりません。

それでもPLINQ、シーケンスを複数のパーティションに分割する方法を明示的に制御できます。したがって、データが複数のスレッド間でどのように分散されるかを自分で制御できます。PLINQのカスタムパーティショナーを参照してください。

于 2012-11-30T20:42:09.150 に答える
0

マルチスレッドの生産者/消費者パターンを使用すると、アイテムを同じ順序で処理しながら、アイテムを同時に処理できるようになります。ただし、次のアイテムの処理が開始される前に各アイテムの処理が完了することを確認する必要がある場合は、Servyが言うように運が悪いです。

生産者/消費者パターンでは、順序を維持するために、スレッドセーフキューを使用できます。1つ以上のプロデューサースレッドが、処理されるアイテムをキューに入れます。この場合、1人のプロデューサーがリストから順番にアイテムをキューに渡します。その後、複数のコンシューマスレッドがアイテムをデキューできます。

詳細については、 http://en.wikipedia.org/wiki/Producer-consumer_problemを参照してください。

于 2012-11-30T19:46:59.800 に答える