Code Review: Wykonywanie wielu zadań i czekanie na wynik

Wielowątkowość jest na tyle łatwo dostępna, że programiści próbują zrównoleglić jak największą liczbę zadań. Przykład:

internal class Program
{
   private static void Main(string[] args)
   {
       Task.WaitAll(Task.Factory.StartNew(Run1), Task.Factory.StartNew(Run2), Task.Factory.StartNew(Run3));
   }

   private static void Run1()
   {
   }

   private static void Run2()
   {            
   }

   private static void Run3()
   {

   }
}

W tym konkretnym przykładzie, lepsze byłoby prawdopodobnie Parallel.Invoke. Ale nie o to mi chodzi. Nie chciałem pokazywać realnego przykładu, ponieważ zbyt skomplikowałoby to post. Załóżmy, że musimy wykonać kilka zadań równoległe a potem czekać na wynik. Prostym sposobem można zoptymalizować kod, wykonując jedno zadanie na wątku macierzystym. Poprawiony kod:

Task t1 = Task.Factory.StartNew(Run1);
Task t2 = Task.Factory.StartNew(Run2);
Run3();
Task.WaitAll(t1,t2);

Skoro i tak musimy blokować macierzysty wątek, to nie ma potrzeby tworzyć kolejnego na Run3. Lepiej wykorzystać macierzysty wątek, niż marnować go na czekanie. Oszczędzamy tutaj zmianę kontekstu, co w systemach low-latency\high frequency może mieć znaczenie. Dla wielu biznesowych aplikacji, nie ma to dużego wpływu. Wciąż jednak, lepiej pisać kod wydajniejszy, zwłaszcza, że w tym przypadku jest to po prostu łatwiejsze.

Leave a Reply

Your email address will not be published.