"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية منع حالة الجمود في Go Concurrency مع sync.WaitGroup؟

كيفية منع حالة الجمود في Go Concurrency مع sync.WaitGroup؟

تم النشر بتاريخ 2024-11-02
تصفح:797

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

حل حالة توقف تام لـ Goroutines

في هذا السيناريو، واجهت خطأ حالة توقف تام في رمز التزامن Go الخاص بك. دعونا نتعمق في المشكلة ونقدم حلاً فعالاً.

يحدث الخطأ بسبب عدم التطابق بين سلوك المنتجين والمستهلكين. يقوم منتجوك، المطبقون في وظيفة المنتج، بإرسال القيم على القناة ch لمدة محدودة. ومع ذلك، فإن المستهلك، الموجود في وظيفتك الرئيسية، يعمل إلى أجل غير مسمى، ويحاول بلا نهاية تلقي القيم من الفصل.

لحل هذا المأزق، تحتاج إلى التأكد من أن المستهلك يحترم إكمال المنتجين. وهذا يعني أن المستهلك يجب أن ينتهي تلقائيًا عندما ينتهي المنتجون من إرسال القيم.

أحد الأساليب الفعالة هو استخدام sync.WaitGroup لتنسيق المنتجين. تسمح لك مجموعة الانتظار بتتبع تقدم المنتجين وانتظارهم حتى يكملوا مهامهم قبل إغلاق القناة. إليك نسخة محسنة من الكود الخاص بك:

func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}

في هذا الكود المحدث، يتم استخدام sync.WaitGroup لتتبع عدد المنتجين النشطين. يقوم المنتجون باستدعاء wg.Done()‎ لتقليل مجموعة الانتظار عند الانتهاء من إرسال القيم. ينتظر الإجراء الرئيسي انتهاء جميع المنتجين من استخدام wg.Wait()، ثم يغلق قناة ch.

من خلال استخدام sync.WaitGroup، يمكنك إنشاء آلية تنسيق تسمح للمستهلك الخاص بك باحترام حالة الإكمال المنتجين، وحل خطأ الجمود بشكل فعال.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3