web-dev-qa-db-fra.com

Comment puis-je convertir ce code foreach en Parallel.ForEach?

Je suis un peu confus à propos de Parallel.ForEach.
Qu'est-ce que Parallel.ForEach et que fait-il exactement?
Veuillez ne faire référence à aucun lien MSDN.

Voici un exemple simple:

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);

foreach (string line in list_lines)
{
    //My Stuff
}

Comment puis-je réécrire cet exemple avec Parallel.ForEach?

171
SilverLight
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
    //Your stuff
});
113
L.B

boucle Foreach:

  • Les itérations se déroulent de manière séquentielle, une par une
  • la boucle foreach est exécutée à partir d'un seul thread.
  • la boucle foreach est définie dans chaque framework de .NET
  • L'exécution de processus lents peut être plus lente , car ils sont exécutés en série
    • Le processus 2 ne peut pas commencer avant que 1 ne soit terminé. Le processus 3 ne peut pas commencer avant que 2 & 1 ne soient terminés ...
  • L'exécution de rapides processus peut être plus rapide , car il n'y a pas de temps de threading supplémentaire

Parallel.ForEach:

  • L'exécution se déroule de manière parallèle.
  • Parallel.ForEach utilise plusieurs threads.
  • Parallel.ForEach est défini dans les frameworks .Net 4.0 et supérieurs.
  • L'exécution de processus lents peut être plus rapide , car ils peuvent être exécutés dans parallèle
    • Les processus 1, 2, et 3 peuvent s'exécuter simultanément (voir les threads réutilisés dans l'exemple ci-dessous)
  • L'exécution de processus rapides peut être plus lente , en raison de la charge de traitement supplémentaire

L’exemple suivant montre clairement la différence entre la boucle foreach traditionnelle et

Exemple avec Parallel.ForEach ()

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
    class Program
    {
        static void Main()
        {
            string[] colors = {
                                  "1. Red",
                                  "2. Green",
                                  "3. Blue",
                                  "4. Yellow",
                                  "5. White",
                                  "6. Black",
                                  "7. Violet",
                                  "8. Brown",
                                  "9. Orange",
                                  "10. Pink"
                              };
            Console.WriteLine("Traditional foreach loop\n");
            //start the stopwatch for "for" loop
            var sw = Stopwatch.StartNew();
            foreach (string color in colors)
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
            Console.WriteLine("Using Parallel.ForEach");
            //start the stopwatch for "Parallel.ForEach"
             sw = Stopwatch.StartNew();
            Parallel.ForEach(colors, color =>
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            );
            Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
            Console.Read();
        }
    }
}

sortie

Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds

Exemple avec Parallel.ForEach

1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds
258
Jignesh.Raj
string[] lines = File.ReadAllLines(txtProxyListPath.Text);

// No need for the list
// List<string> list_lines = new List<string>(lines); 

Parallel.ForEach(lines, line =>
{
    //My Stuff
});

Cela entraînera une analyse parallèle des lignes dans la boucle. Si vous souhaitez une introduction plus détaillée et moins "orientée référence" à la classe Parallel, j’ai écrit une série sur la TPL qui inclut un section sur Parallel.ForEach .

43
Reed Copsey

Pour les gros fichiers, utilisez le code suivant (vous avez moins faim de mémoire)

Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
    //Your stuff
});
8
Samuel LEMAITRE

Ces lignes ont fonctionné pour moi.

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});
0
Prince Prasad