دعونا نلقي نظرة على نمط المعجبين. يعد هذا مفيدًا حقًا عندما يكون لدينا بيانات ذات صلة من سلاسل رسائل متعددة نحتاج إلى جمعها معًا.
على سبيل المثال، لنفترض أنك أجريت عدة استدعاءات لواجهة برمجة التطبيقات (API) لخدمات مختلفة وتحتاج إلى دمج النتائج.
هذا نمط سهل التنفيذ، لكن عليك الانتباه إلى كيفية التعامل مع القنوات. من السهل الحصول على حالة الجمود.
// produce is used to simulate the different data sources func produce(id int) chan int { ch := make(chan int) go func() { for i := 0; iنستخدم هنا دالة الإنتاج لمحاكاة المصادر المختلفة. يتم إرسال هذه القنوات المصدرية إلى وظيفة fanin التي تقوم بعملية الدمج.
تقوم وظيفة fanin بإنشاء قناة الإخراج، ثم تقوم بتشغيل goroutine الذي يعمل على كل إدخال. نستخدم WaitGroup للإشارة إلى متى تم دمج جميع مصادر الإدخال في قناة الإخراج.
في هذا المثال البسيط، يتكرر الخيط الرئيسي فقط على الإخراج. لاحظ أنه لا يوجد ضمان على الأمر، حيث أن القيم من المدخلين مختلطة.
النقطة الأساسية التي يجب طرحها هي أنه يتعين علينا إغلاق قناة الإخراج عندما ننتهي من دمج المدخلات. سينتظر مشغل النطاق إلى أجل غير مسمى بمجرد أن تصبح القناة فارغة. قم بالتعليق على سطر الإغلاق (الإخراج) وسترى أنك حصلت على حالة توقف تام.
كيف يمكننا تحسين هذا؟ اترك لي تعليقا أدناه.
شكرًا!
يمكن العثور على رمز هذه المشاركة وجميع المشاركات في هذه السلسلة هنا
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3