القراءة من قنوات متعددة بشكل متزامن في Golang
في Golang، من الممكن إنشاء قناة "واحد لواحد"، حيث يمكن لعدة goroutines الكتابة إلى نفس القناة في وقت واحد. دعنا نستكشف كيفية تحقيق هذه الوظيفة.
أحد الأساليب هو استخدام عبارة تحديد، والتي تسمح لك بالانتظار حتى تتلقى قنوات متعددة البيانات:
func main() {
// Create input channels
c1 := make(chan int)
c2 := make(chan int)
// Create output channel
out := make(chan int)
// Start a goroutine that reads from both input channels and sums the received values
go func(in1, in2 <-chan int, out chan<- int) {
for {
sum := 0
select {
case sum = <-in1:
sum = <-in2
case sum = <-in2:
sum = <-in1
}
out <- sum
}
}(c1, c2, out)
}
يعمل هذا الروتين إلى أجل غير مسمى، حيث يقرأ من كلا القناتين ويرسل مجموع القيم المستلمة إلى قناة الإخراج. لإنهاء goroutine، من الضروري إغلاق قناتي الإدخال.
كطريقة بديلة، يمكنك استخدام الكود التالي:
func addnum(num1, num2, sum chan int) {
done := make(chan bool)
go func() {
n1 := <-num1
done <- true // Signal completion of one channel read
}()
n2 := <-num2 // Read from the other channel
<-done // Wait for the first read to complete
sum <- n1 n2
}
تستخدم هذه الوظيفة قناة "تم" منفصلة لإعلامك عند قراءة قناة واحدة بنجاح. ومع ذلك، يمكن أن يكون هذا الأسلوب أقل مرونة، لأنه يتطلب تعديل goroutines التي تكتب إلى قنوات الإدخال.
يعتمد النهج المناسب على المتطلبات المحددة لتطبيقك. بغض النظر عن الطريقة التي تختارها، توفر ميزات التزامن في Golang أدوات قوية للتعامل مع قنوات متعددة في وقت واحد.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3