أنماط خطوط الأنابيب والمراحل
تركيب خطوط أنابيب متزامنة متعددة المراحل
أنماط خطوط الأنابيب والمراحل درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
ما خط الأنابيب؟
خط الأنابيب المتزامن هو سلسلة من المراحل المتصلة بالقنوات. تستقبل كل مرحلة القيم من المرحلة السابقة، وتحولها، ثم ترسل النتائج إلى المرحلة التالية، مما يتيح تشغيل المراحل بالتزامن.
خط أنابيب من ثلاث مراحل
إنشاء → تحويل → استهلاك:
func generate(nums ...int) <-chan int {
out := make(chan int)
go func() { defer close(out); for _, n := range nums { out <- n } }()
return out
}
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() { defer close(out); for n := range in { out <- n*n } }()
return out
}
for v := range square(generate(2, 3, 4)) {
fmt.Println(v) // 4, 9, 16
}نمط المرحلة
كل مرحلة دالة تأخذ قناة إدخال وتعيد قناة إخراج. ويمكن تركيب المراحل بسهولة وتشغيلها بالتوازي بشكل مستقل.
التوزيع المتفرع داخل خط الأنابيب
قسّم مرحلة إلى N من goroutines لتشغيل العمل المرتبط بالمعالج بالتوازي:
func parallelSquare(in <-chan int, n int) <-chan int {
outs := make([]<-chan int, n)
for i := 0; i < n; i++ {
outs[i] = square(in) // all read from same in
}
return merge(outs...)
}الإلغاء باستخدام context
مرّر context إلى كل مرحلة. عند إلغائه، تتوقف المراحل عن القراءة وتغلق قنوات الإخراج الخاصة بها، مما يفرغ خط الأنابيب بأكمله.
func stage(ctx context.Context, in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for {
select {
case v, ok := <-in:
if !ok { return }
select {
case out <- process(v):
case <-ctx.Done(): return
}
case <-ctx.Done(): return
}
}
}()
return out
}الضغط العكسي
استخدم قنوات ذات مخزن مؤقت بين المراحل للفصل بين سرعة المنتج وسرعة المستهلك. من دون التخزين المؤقت، تؤدي المرحلة البطيئة إلى إيقاف خط الأنابيب بأكمله.
out := make(chan Result, 50) // buffer 50 resultsتمرير الأخطاء
غلّف القيم داخل بنية نتيجة لتمرير الأخطاء عبر خط الأنابيب دون التسبب في panic:
type item struct { val int; err error }نمط قناة Done
استخدم قناة done بديلًا عن context في خطوط الأنابيب الأبسط. أغلق done لإبلاغ جميع المراحل بالتوقف.
done := make(chan struct{})
defer close(done)ضمانات الترتيب
يحافظ خط الأنابيب البسيط على الترتيب إذا كانت كل مرحلة تسلسلية. أما المراحل التي تعمل بالتوازي فلا تحافظ على الترتيب؛ لذا استخدم حقل فهرس لإعادة ترتيب النتائج في المراحل اللاحقة عند الحاجة.
خط أنابيب مع WaitGroup
لا تحتاج المرحلة الأخيرة إلى إغلاق قناة؛ يكفي أن تستخدم range عليها. استخدم WaitGroup في fan-in لإغلاق القناة المدمجة بعد انتهاء جميع goroutines المنتجة.
الاستخدامات العملية
من التطبيقات الشائعة لخطوط الأنابيب: معالجة بيانات ETL، وتغيير حجم الصور، وتحليل السجلات، وأنظمة البناء، ومعالجات الطلبات المتدفقة.
تحقق سريع
كيف تمرر الإلغاء عبر خط أنابيب متعدد المراحل؟
مراجعة: نمط خط الأنابيب
النقاط الأساسية:
- المرحلة: func(in <-chan T) <-chan U — تُركّب لإنشاء خطوط الأنابيب
- الإلغاء عبر context؛ والضغط العكسي عبر القنوات ذات المخزن المؤقت
- التوزيع المتفرع داخل المرحلة لتحقيق التوازي
- غلّف القيم داخل بنية نتيجة لتمرير الأخطاء
تعلم Go مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «أنماط خطوط الأنابيب والمراحل» مجاني؟
نعم — نص درس «أنماط خطوط الأنابيب والمراحل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط خطوط الأنابيب والمراحل»؟
تركيب خطوط أنابيب متزامنة متعددة المراحل تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أنماط خطوط الأنابيب والمراحل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنماط خطوط الأنابيب والمراحل
- errgroup لمعالجة الأخطاء المتزامنة
- نمط Semaphore
- اكتشاف التسرب والإلغاء