طريق مسدود في GoLang: لماذا يمتد عبر قناة مخزنة؟
عند استخدام القنوات المخزنة في GoLang، من المهم تجنب إنشاء حالة طريق مسدود . أثارت مشكلة حديثة مخاوف بشأن حدوث حالة توقف تام أثناء محاولة النطاق عبر قناة مخزنة بعد اكتمال جميع goroutines.
يحاول الكود المقدم استخدام قناة مخزنة بسعة 4 وتنتج 4 goroutines التي ترسل البيانات إلى القناة. ومع ذلك، يحدث حالة توقف تام بسبب:
الحل 1: توسيع حجم القناة وإغلاقها بعد الانتهاء
لحل الجمود، يمكن زيادة حجم القناة وإغلاقها بعد اكتمال جميع الإجراءات:
ch := make(chan []int, 5)
...
wg.Wait()
close(ch)
ومع ذلك، فإن هذا يلغي فوائد خطوط الأنابيب، لأنه يمنع الطباعة حتى تنتهي جميع المهام.
الحل 2: إكمال الإشارة من داخل روتين الطباعة
لتمكين خطوط الأنابيب الفعلية، يمكن استدعاء الدالة Done() ضمن روتين الطباعة:
func main() {
ch := make(chan []int, 4)
...
go func() {
for c := range ch {
fmt.Printf("c is %v\n", c)
wg.Done()
}
}()
...
}
يضمن هذا الأسلوب أن الدالة Done() لا يتم استدعاؤها إلا بعد طباعة كل عنصر، مما يشير بشكل فعال إلى اكتمال كل goroutine.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3