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

نمط Fanout-Fanin في Go

تم النشر بتاريخ 2024-07-31
تصفح:871

Fanout-Fanin Pattern in Go

في المنشورين السابقين، نظرنا إلى Fanout و Fanin بشكل منفصل. غالبًا ما نستخدمها معًا حيث يكون لدينا دفق بيانات واحد حيث نريد العمل على العناصر بشكل فردي ويمكننا القيام بذلك بأمان باستخدام التزامن. لذا، فإننا ننتقل إلى عدة سلاسل عاملة ثم نعود مرة أخرى إلى تدفق واحد.

على سبيل المثال، لنفترض أن لديك ملف سجل كبير. يمكنك تقسيم الملف إلى أجزاء، مما يسمح لكل عامل بالعمل على جزء مختلف من الملف بشكل متزامن، ثم دمج النتائج.

إذا تابعت المنشورين السابقين فهذا النمط واضح. راجع الروابط أعلاه إذا لم تكن متأكدًا.

// produce is simulating our single input as a channel
func produce() chan int {
    ch := make(chan int)
    go func() {
        for i := 0; i 



توجد وظيفة إنتاج () تقوم بإنشاء دفق إدخال محاكاة للأرقام.

هناك وظيفة عاملة تعمل على قناة الإدخال حتى لا يكون هناك المزيد من البيانات. في كل قيمة، يقوم بمعالجة بيانات الإدخال (يحدد ما إذا كانت القيمة فردية أو زوجية)، ثم يرسل بنية النتيجة إلى قناة الإخراج.

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

يحصل الخيط الرئيسي على تدفق المدخلات من الإنتاج، ثم يطلق عددًا من العمال مما يمنح كل عامل قناة خاصة به حيث سيرسل نتائجه.

يتم بعد ذلك إرسال قنوات النتائج هذه إلى عملية fanin. بالنسبة للمعجبين، نقوم بإنشاء قناة لاستقبال المخرجات، ثم نقوم بتشغيل نظام goroutine لكل قناة من القنوات العاملة. يتكرر كل goroutine ببساطة عبر القناة حتى لا يكون هناك المزيد من البيانات ثم ينتهي. تذكر أننا أغلقنا قناة النتيجة في سلسلة العمليات، وهذا ما يسمح بإنهاء حلقة for

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

مع جميع البيانات الموجودة في قناة الإخراج، يمكن للخيط الرئيسي المضي قدمًا وعرض النتائج. لاحظ أننا نستخدم قناة منطقية لمنع انتهاء الخيط الرئيسي حتى يتم الانتهاء من كل شيء؛ وإلا فإنه سيتم إنهاء العملية.

لاحظ أن هناك طريقة أخرى للقيام بالتشجيع باستخدام عبارة التحديد. التقنية المستخدمة هنا أكثر نظافة قليلاً حيث يمكننا زيادة أو تقليل عدد العمال.

لاحظ أيضًا أننا لم نتناول أي شيء فيما يتعلق بالإنهاء المبكر لأشياء مثل SIGTERM أو SIGINT. وهذا يضيف المزيد من التعقيد قليلا.

كيف يمكنك تنفيذ ذلك؟ هناك تطبيقات أخرى لنمط المروحة/المروحة. من فضلك اترك تعليقاتك وأفكارك أدناه؟

شكرًا!

يمكن العثور على رمز هذه المشاركة وجميع المشاركات في هذه السلسلة هنا

بيان الافراج تم نشر هذه المقالة على: https://dev.to/johnscode/fanout-fanin-in-go-3h9o?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3