Bagaimana cara kerja MaxDegreeOfParallelism?

Saya mencoba memahami bagaimana MaxDegreeOfParallelism sebenarnya mempengaruhi paralelisme saat memanggil Parallel.For. Inilah kode yang saya coba:

  static void Main(string[] args)
  {
     var parallelOptions = new ParallelOptions()
        {
           MaxDegreeOfParallelism = 1000,
        };

     Parallel.For(1, 1000, parallelOptions, i =>
        {
           Console.WriteLine(i);
           Thread.Sleep(TimeSpan.FromHours(1));
        });
  }

Saat saya menjalankan kode ini, saya langsung melihat output konsol 1 hingga 9 (dalam ~0,1 detik). Kemudian setiap detik nomor baru akan ditambahkan - 10, 11, 12 dan seterusnya. Sementara itu, di Windows Task Manager saya melihat jumlah thread yang mengeksekusi dalam proses meningkat dengan satu thread baru per detik.

Dengan kode ini, mengapa saya tidak langsung melihat keluaran nilai 1 hingga 1000?

(Saya menyadari bahwa kode ini mungkin tidak masuk akal dan mungkin merupakan ide yang buruk untuk membuat 1000 rangkaian pesan di laptop saya, namun saya ingin memahami apa yang terjadi di sini)

EDIT: Pertanyaan ini - menurut pendapat saya - salah ditandai sebagai duplikat. Saya memahami bahwa MaxDegreeOfParallelism adalah derajat paralelisme maks. Tentu saja akan ada banyak peralihan konteks jika saya menjalankan 1000 utas secara bersamaan, tetapi pertanyaan tertaut tidak menjelaskan cara kerjanya sebenarnya. Bagaimana jika saya hanya ingin menjalankan jumlah thread yang lebih masuk akal, katakanlah 32? Komputer saya mampu menanganinya dengan baik, tetapi dengan perilaku Paralel. Untuk yang dijelaskan di atas, diperlukan ~20 detik untuk memutar sejumlah utas tersebut.


person Nitramk    schedule 17.03.2015    source sumber
comment
Karena ini adalah DOP Maks, bukan nilai pasti berapa banyak hal yang dilakukan secara paralel. Karena komputer Anda tidak mampu menjalankan 1000 tugas secara bersamaan (mungkin), komputer tidak akan mencoba. MaxDOP dimaksudkan sebagai pembatas, seperti membatasi MaxDOP menjadi 2, bukan berapa banyak inti yang ada di kotak Anda.   -  person vcsjones    schedule 18.03.2015
comment
Kemungkinan duplikat dari: stackoverflow.com/questions/9538452/   -  person Greg    schedule 18.03.2015
comment
Singkatnya, jika Anda tidak menggunakan prosesor. Ini akan menghalangi semua tugas yang berjalan secara paralel untuk hasil maksimal yang Anda tentukan. Ini sangat umum khususnya untuk SQL.   -  person Greg    schedule 18.03.2015
comment
Komputer saya mampu menjalankan 1000 thread secara bersamaan. Jika saya memberi tahu Parallel.For untuk menjalankan, katakanlah 32 utas, mengapa harus menunggu 1 detik antara memulai setiap utas baru?   -  person Nitramk    schedule 18.03.2015


Jawaban (1)


MaxDegreeOfParallelism mengacu pada jumlah maksimum tugas pekerja yang akan dijadwalkan pada satu waktu melalui perulangan paralel.

Tingkat paralelisme secara otomatis dikelola oleh implementasi kelas Paralel, penjadwal tugas default, dan kumpulan thread .NET. Throughput dioptimalkan dalam berbagai kondisi.

Untuk tingkat paralelisme yang sangat besar, Anda mungkin juga ingin menggunakan metode SetMinThreads kelas ThreadPool sehingga thread ini dibuat tanpa penundaan. Jika Anda tidak melakukan ini maka algoritme injeksi thread pada kumpulan thread mungkin membatasi seberapa cepat thread dapat ditambahkan ke kumpulan thread pekerja yang digunakan oleh loop paralel. Mungkin diperlukan waktu lebih lama daripada yang Anda inginkan untuk membuat jumlah utas yang diperlukan.

person Tomasz Jaskuλa    schedule 17.03.2015