รูปแบบ Fan-in และ Fan-out
รวมหลายแชนเนลและกระจายงาน
รูปแบบ Fan-in และ Fan-out เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
Fan-out คืออะไร
Fan-out กระจายงานจากช่องสัญญาณหนึ่งช่องไปยังโกโรทีนหลายตัว ทำให้ประมวลผลแบบขนานได้ worker แต่ละตัวจะรับข้อมูลจากช่องสัญญาณขาเข้าเดียวกัน
ตัวอย่าง Fan-out
สร้าง worker จำนวน N ตัว โดยทุกตัวอ่านจากช่องสัญญาณ jobs ที่ใช้ร่วมกัน:
func fanOut(jobs <-chan Job, n int) {
for i := 0; i < n; i++ {
go func() {
for job := range jobs {
process(job)
}
}()
}
}Fan-in คืออะไร
Fan-in รวมช่องสัญญาณหลายช่องให้เป็นหนึ่งช่อง เพื่อให้ผู้บริโภครายเดียวสามารถอ่านผลลัพธ์จากผู้ผลิตหลายรายได้
Fan-in ด้วยโกโรทีน
สร้างโกโรทีนหนึ่งตัวต่อช่องสัญญาณขาเข้าแต่ละช่อง โดยโกโรทีนแต่ละตัวจะส่งค่าต่อไปยังช่องสัญญาณขาออกที่ใช้ร่วมกัน
func fanIn(cs ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
for _, c := range cs {
wg.Add(1)
go func(ch <-chan int) {
defer wg.Done()
for v := range ch { out <- v }
}(c)
}
go func() { wg.Wait(); close(out) }()
return out
}Fan-in ด้วย select
สำหรับช่องสัญญาณขาเข้าจำนวนคงที่ การใช้ลูป select จะง่ายกว่าการสร้างโกโรทีนแยกสำหรับแต่ละช่อง
func merge(a, b <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for a != nil || b != nil {
select {
case v, ok := <-a: if !ok { a = nil } else { out <- v }
case v, ok := <-b: if !ok { b = nil } else { out <- v }
}
}
}()
return out
}ขั้นตอนของไปป์ไลน์
ผสาน Fan-out และ Fan-in เพื่อสร้างขั้นตอนของไปป์ไลน์: ช่องสัญญาณขาเข้าหนึ่งช่อง worker แบบขนานจำนวน N ตัว และช่องสัญญาณขาออกหนึ่งช่องที่รวมผลลัพธ์แล้ว
func parallelStage(in <-chan Work, n int) <-chan Result {
outs := make([]<-chan Result, n)
for i := 0; i < n; i++ {
outs[i] = worker(in)
}
return fanIn(outs...)
}การปิดช่องสัญญาณอย่างเรียบร้อย
ผู้ส่งเป็นผู้ปิดช่องสัญญาณ ส่วนผู้รับตรวจจับการปิดได้ด้วยรูปแบบการรับค่าที่มีสองค่า หรือใช้การวนอ่านค่า ห้ามปิดช่องสัญญาณจากฝั่งผู้รับ
for v := range in { // exits when in is closed
process(v)
}การประสานงานด้วย WaitGroup
ใช้ sync.WaitGroup เพื่อตรวจสอบว่า worker ทั้งหมดใน Fan-out ทำงานเสร็จแล้ว จากนั้นจึงปิดช่องสัญญาณขาออก เพื่อให้ผู้บริโภคถัดไปทำงานเสร็จได้
แรงดันย้อนกลับ
ใช้ช่องสัญญาณแบบมีบัฟเฟอร์ระหว่างขั้นตอนของไปป์ไลน์เพื่อรองรับงานที่เข้ามาเป็นชุด กำหนดขนาดบัฟเฟอร์ตามความแตกต่างของเวลาแฝงที่คาดไว้ระหว่างผู้ผลิตและผู้บริโภค
out := make(chan Result, 100) // buffer absorbs burstsการส่งต่อข้อผิดพลาด
ห่อผลลัพธ์ไว้ในโครงสร้างที่มีทั้งค่าและข้อผิดพลาด เพื่อให้ข้อผิดพลาดไหลผ่านไปป์ไลน์ไปพร้อมกับข้อมูลโดยไม่ทำให้โปรแกรมหยุดทำงานด้วย panic
type Result struct {
Value int
Err error
}การยกเลิกด้วยบริบท
ส่งบริบทผ่านขั้นตอนต่าง ๆ ของไปป์ไลน์ และตรวจสอบ ctx.Done() ในแต่ละขั้นตอน เพื่อให้ไปป์ไลน์ทั้งหมดหยุดทำงานเมื่อถูกยกเลิก
case <-ctx.Done():
return ctx.Err()ตรวจสอบความเข้าใจอย่างรวดเร็ว
ในรูปแบบ Fan-in ใครเป็นผู้ปิดช่องสัญญาณขาออกที่รวมแล้ว
ทบทวน: Fan-in และ Fan-out
ประเด็นสำคัญ:
- Fan-out: worker หลายตัวอ่านจากช่องสัญญาณเดียว
- Fan-in: มีโกโรทีนหนึ่งตัวต่อแหล่งข้อมูล และรวมข้อมูลทั้งหมดลงในช่องสัญญาณขาออกเดียว
- WaitGroup ประสานงานการปิดช่องสัญญาณที่รวมแล้ว
- ใช้บริบทสำหรับการยกเลิก และใช้ช่องสัญญาณแบบมีบัฟเฟอร์สำหรับแรงดันย้อนกลับ
คำถามที่พบบ่อย
บทเรียน “รูปแบบ Fan-in และ Fan-out” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบ Fan-in และ Fan-out” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Fan-in และ Fan-out”
รวมหลายแชนเนลและกระจายงาน คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบ Fan-in และ Fan-out” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำสั่ง select
- การหมดเวลาและตัวนับช่วงเวลา
- รูปแบบ Fan-in และ Fan-out
- รูปแบบกลุ่มผู้ทำงาน