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

كيف يمكنك تحقيق القراءة المتزامنة من قنوات متعددة في Golang؟

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

How Can You Achieve Concurrent Reading from Multiple Channels in Golang?

القراءة من قنوات متعددة بشكل متزامن في 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