مراحل المسار
صِل مراحل القنوات
مراحل المسار درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
ما خط الأنابيب
خط الأنابيب هو سلسلة من المراحل المتصلة بالقنوات. تستقبل كل مرحلة القيم، وتنفّذ عملًا عليها، ثم ترسل النتائج إلى المرحلة اللاحقة. وتتدفق البيانات مثل خط التجميع.
- كل مرحلة هي goroutine
- تتواصل المراحل عبر القنوات فقط
- قابل للتركيب وسهل الفهم
اصطلاح توقيع المرحلة
وفقًا للاصطلاح، تستقبل كل مرحلة قناة إدخال واحدة أو أكثر للقراءة فقط، وتُرجع قناة إخراج للقراءة فقط. وهذا يجعل ربط المراحل متتابعة أمرًا سهلًا.
func stage(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for v := range in {
out <- v
}
}()
return out
}مرحلة المصدر
تنتج المرحلة الأولى البيانات. وغالبًا ما تستقبل شريحة أو معاملات متغيرة، ثم تدفقها إلى قناة.
func numbers(vals ...int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for _, v := range vals {
out <- v
}
}()
return out
}مرحلة التحويل
تضرب هذه المرحلة كل قيمة في عشرة. وتقرأ من in وتكتب القيمة المحوّلة إلى out.
func tenfold(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for v := range in {
out <- v * 10
}
}()
return out
}مرحلة التصفية
لا تمرّر مرحلة التصفية إلا القيم التي تستوفي شرطًا معينًا. وهنا نُبقي الأعداد الزوجية ونسقط الباقي.
func evens(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for v := range in {
if v%2 == 0 {
out <- v
}
}
}()
return out
}ربط المراحل
ركّبوا المراحل بتمرير مخرج إحدى المراحل بوصفه إدخال المرحلة التالية. فتبدو السلسلة كما لو كانت جملة تقريبًا.
pipe := tenfold(evens(numbers(1, 2, 3, 4)))
for v := range pipe {
fmt.Println(v)
}defer close(out)
يضمن استخدام defer close(out) إغلاق قناة الإخراج عند عودة goroutine الخاصة بالمرحلة، حتى إذا أضفتم لاحقًا عمليات عودة مبكرة. وينقل ذلك إشارة انتهاء التدفق إلى المراحل اللاحقة.
خط أنابيب متكامل
مصدر، ثم تصفية، ثم تحويل. شغّلوه لرؤية مضاعفات القيم الزوجية في عشرة فقط.
package main
import "fmt"
func numbers(vals ...int) <-chan int {
out := make(chan int)
go func() { defer close(out); for _, v := range vals { out <- v } }()
return out
}
func evens(in <-chan int) <-chan int {
out := make(chan int)
go func() { defer close(out); for v := range in { if v%2 == 0 { out <- v } } }()
return out
}
func tenfold(in <-chan int) <-chan int {
out := make(chan int)
go func() { defer close(out); for v := range in { out <- v * 10 } }()
return out
}
func main() {
for v := range tenfold(evens(numbers(1, 2, 3, 4, 5, 6))) {
fmt.Println(v)
}
}تدفق مستمر لا معالجة على دفعات
تتدفق القيم عبر خط الأنابيب واحدة تلو الأخرى أثناء إنتاجها. ويمكن لمرحلة التحويل أن تبدأ العمل على العنصر الأول قبل أن يصدر المصدر العنصر الأخير. ويحافظ ذلك على انخفاض استهلاك الذاكرة وزمن استجابة قصير.
خطوط الأنابيب كسولة
لا تنفّذ المرحلة أي عمل حتى يقرأ شيء ما من مخرجها. وإذا توقف المستهلك عن استخدام range، تتوقف المراحل السابقة عند عمليات الإرسال. ويمنع هذا الضغط العكسي الطبيعي الحسابات المهدرة.
إضافة التزامن
لتسريع مرحلة بطيئة، وزّعوها على عدة مثيلات تقرأ من الإدخال نفسه، ثم ادمجوا مخرجاتها. ويبقى توقيع المرحلة كما هو، ولا يتغير سوى التوصيل.
اختبار سريع
اختبروا معرفتكم بخطوط الأنابيب.
مراجعة
تعلّمتم مراحل خط الأنابيب:
- كل مرحلة: إدخال للقراءة فقط، وتُرجع مخرجًا للقراءة فقط
- ينقل defer close(out) إشارة انتهاء التدفق
- اربطوا المراحل بتضمين الاستدعاءات
- تتدفق خطوط الأنابيب بكسل وبضغط عكسي
الأسئلة الشائعة
هل درس «مراحل المسار» مجاني؟
نعم — نص درس «مراحل المسار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «مراحل المسار»؟
صِل مراحل القنوات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «مراحل المسار»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.