0Pricing
Go Academy · บทเรียน

รูปแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คำสั่ง select
  2. การหมดเวลาและตัวนับช่วงเวลา
  3. รูปแบบ Fan-in และ Fan-out
  4. รูปแบบกลุ่มผู้ทำงาน
← กลับไปที่ Go Academy