MaxDegreeOfParallelism ทำงานอย่างไร

ฉันกำลังพยายามทำความเข้าใจว่า MaxDegreeOfParallelism ส่งผลต่อความขนานจริง ๆ อย่างไรเมื่อเรียก Parallel.For นี่คือโค้ดที่ฉันกำลังทดลอง:

  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));
        });
  }

เมื่อฉันรันโค้ดนี้ ฉันเห็นคอนโซลเอาต์พุต 1 ถึง 9 ทันที (ภายใน ~0.1 วินาที) จากนั้นทุก ๆ วินาทีจะมีการเพิ่มหมายเลขใหม่ - 10, 11, 12 และอื่น ๆ ในขณะเดียวกันในตัวจัดการงานของ Windows ฉันเห็นว่าจำนวนเธรดที่ดำเนินการในกระบวนการเพิ่มขึ้นเมื่อมีหนึ่งเธรดใหม่ต่อวินาที

ด้วยโค้ดนี้ เหตุใดฉันจึงไม่เห็นผลลัพธ์ของค่า 1 ถึง 1,000 ในทันที

(ฉันตระหนักดีว่าโค้ดนี้อาจไม่สมเหตุสมผล และอาจเป็นความคิดที่ไม่ดีที่จะหมุน 1,000 เธรดบนแล็ปท็อปของฉัน แต่ฉันอยากจะเข้าใจว่าเกิดอะไรขึ้นที่นี่)

แก้ไข: ในความคิดของฉัน คำถามนี้ถูกทำเครื่องหมายว่าซ้ำกันอย่างไม่ถูกต้อง ฉันเข้าใจว่า MaxDegreeOfParallelism คือระดับ สูงสุด ของความขนาน แน่นอนว่าจะมีการสลับบริบทจำนวนมากหากฉันมี 1,000 เธรดที่ทำงานในเวลาเดียวกัน แต่คำถามที่เชื่อมโยงไม่ได้อธิบายวิธีการทำงานจริง จะเป็นอย่างไรหากฉันต้องการรันเธรดในจำนวนที่เหมาะสมมากขึ้น เช่น 32 เธรด? คอมพิวเตอร์ของฉันสามารถจัดการสิ่งนั้นได้ดี แต่ด้วยพฤติกรรมของ Parallel ตามที่อธิบายไว้ข้างต้น ใช้เวลาประมาณ 20 วินาทีในการหมุนเธรดตามจำนวนนั้น


person Nitramk    schedule 17.03.2015    source แหล่งที่มา
comment
เนื่องจากเป็น สูงสุด DOP ไม่ใช่ค่าที่แน่นอนของจำนวนสิ่งที่ทำพร้อมกัน เนื่องจากคอมพิวเตอร์ของคุณไม่สามารถทำงาน 1,000 งานพร้อมกันได้ (อาจเป็นไปได้) จึงไม่ได้ลอง MaxDOP มีไว้เพื่อเป็นข้อจำกัด เช่น การจำกัด MaxDOP ไว้ที่ 2 แทนที่จะจำกัดจำนวนคอร์ในกล่องของคุณ   -  person vcsjones    schedule 18.03.2015
comment
อาจซ้ำกันของ: stackoverflow.com/questions/9538452/   -  person Greg    schedule 18.03.2015
comment
สรุปก็คือ หากคุณไม่ได้ใช้โปรเซสเซอร์ มันจะขัดขวางงานทั้งหมดที่ทำงานแบบขนานตามจำนวนสูงสุดที่คุณระบุ นี่เป็นเรื่องปกติสำหรับ SQL โดยเฉพาะ   -  person Greg    schedule 18.03.2015
comment
คอมพิวเตอร์ของฉันสามารถรัน 1,000 เธรดในเวลาเดียวกัน ถ้าฉันบอก Parallel.For ให้รันว่ามี 32 เธรด ทำไมจึงต้องรอ 1 วินาทีระหว่างการเริ่มแต่ละเธรดใหม่   -  person Nitramk    schedule 18.03.2015


คำตอบ (1)


MaxDegreeOfParallelism หมายถึงจำนวนงานของผู้ปฏิบัติงานสูงสุดที่จะถูกกำหนดเวลาในแต่ละครั้งโดยการวนซ้ำแบบขนาน

ระดับของความขนานได้รับการจัดการโดยอัตโนมัติโดยการใช้ คลาส Parallel ตัวกำหนดเวลางานเริ่มต้น และพูลเธรด .NET ปริมาณงานได้รับการปรับให้เหมาะสมภายใต้เงื่อนไขที่หลากหลาย

สำหรับ ความขนานในระดับที่สูงมาก คุณอาจต้องการใช้เมธอด SetMinThreads ของคลาส ThreadPool เพื่อให้เธรดเหล่านี้ถูกสร้างขึ้นโดยไม่ชักช้า หากคุณไม่ทำเช่นนี้ อัลกอริธึมการแทรกเธรดของพูลเธรดอาจจำกัดความเร็วของเธรดที่สามารถเพิ่มลงในพูลของเธรดของผู้ปฏิบัติงานที่ใช้โดยการวนซ้ำแบบขนาน อาจใช้เวลานานกว่าที่คุณต้องการสร้างเธรดตามจำนวนที่ต้องการ

person Tomasz Jaskuλa    schedule 17.03.2015