Akademi C# · Pelajaran

Parallel.ForEach, PLINQ

Jalankan kerja secara selari dengan Parallel.ForEach dan bina saluran paip selari dengan PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).

Pelajaran 1 daripada 38 langkah

Parallel.ForEach, PLINQ ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 1 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 3 pelajaran.

Mengapa gelung selari

Matlamat: Gunakan CPU dengan lebih baik.

  • Parallel.ForEach: tindakan bagi setiap item
  • PLINQ: pertanyaan selari dengan operator
  • Kawal tahap pemprosesan selari
  • Berhati-hati dengan kesan sampingan

Asas Parallel.ForEach

Parallel.ForEach mengagihkan lelaran merentas utasan; setiap item menjalankan tindakan yang diberikan.

using System;
using System.Threading.Tasks;

public class Program
{
  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3, 4, 5, 6 };

    // Runs iterations concurrently on thread pool
    Parallel.ForEach(data, x =>
    {
      int y = x * x; // small CPU work
      Console.WriteLine("x=" + x + " y=" + y + " on " + Environment.CurrentManagedThreadId);
    });
  }
}

Kawal pemprosesan selari

Gunakan ParallelOptions.MaxDegreeOfParallelism untuk mengehadkan keserentakan apabila sumber adalah terhad.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
    ParallelOptions opt = new ParallelOptions();
    opt.MaxDegreeOfParallelism = 2; // limit concurrency

    Parallel.ForEach(data, opt, x =>
    {
      Console.WriteLine("Start " + x);
      Thread.Sleep(150); // simulate work
      Console.WriteLine("Done " + x);
    });
  }
}

Saluran paip PLINQ

PLINQ menjalankan operator LINQ secara selari. ForAll menggunakan hasil secara serentak (tanpa susunan).

using System;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    int[] nums = Enumerable.Range(1, 20).ToArray();

    // Filter then project in parallel
    var query =
      nums
        .AsParallel()
        .WithDegreeOfParallelism(2)
        .Where(n => n % 2 == 0)
        .Select(n => n * n);

    // ForAll consumes in parallel; order not guaranteed
    query.ForAll(sq => Console.WriteLine(sq));
  }
}

Kawalan susunan

Gunakan AsOrdered untuk mengekalkan susunan; AsSequential beralih kembali kepada LINQ satu utasan apabila diperlukan.

using System;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    int[] nums = new int[] { 5, 4, 3, 2, 1 };

    // Preserve original sequence order for the output
    var ordered =
      nums.AsParallel().AsOrdered().Select(n => n * 10).ToArray();

    // Switch back to sequential for a section if needed
    var seq =
      nums.AsParallel().Select(n => n + 1).AsSequential().Where(n => n > 3).ToArray();

    Console.WriteLine("Ordered: " + string.Join(",", ordered));
    Console.WriteLine("Sequential tail: " + string.Join(",", seq));
  }
}

Keselamatan & petua

Petua:

  • Elakkan keadaan boleh ubah yang dikongsi; utamakan fungsi tulen.
  • Gunakan koleksi selamat untuk utasan jika anda mesti menulis data.
  • Lakukan kelompok yang lebih besar dan bukannya item kerja yang kecil.
  • Ukur prestasi: pemprosesan selari membantu kerja terikat CPU, bukan penantian I/O.

Parallel.ForEach berbanding PLINQ

Semakan pantas: Apakah perbezaan utama antara Parallel.ForEach dengan PLINQ?

Imbas kembali

Imbas kembali: Gunakan Parallel.ForEach untuk tindakan bagi setiap item; gunakan PLINQ untuk membina pertanyaan selari, mengawal keserentakan dan, secara pilihan, mengekalkan susunan.

Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Parallel.ForEach, PLINQ” percuma?

Ya — teks penuh “Parallel.ForEach, PLINQ” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Parallel.ForEach, PLINQ”?

Jalankan kerja secara selari dengan Parallel.ForEach dan bina saluran paip selari dengan PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 3.

Berapa lamakah pelajaran “Parallel.ForEach, PLINQ” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Parallel.ForEach, PLINQ
  2. Pengeluar/pengguna dengan Channels (gambaran keseluruhan)
  3. Pertukaran kadar pemprosesan berbanding kependaman
← Kembali ke Akademi C#