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

ไฟเบอร์

การทำงานพร้อมกันแบบร่วมมือ

ไฟเบอร์ เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

ไฟเบอร์คืออะไร

ไฟเบอร์คือหน่วยการทำงานขนาดเล็กที่คุณควบคุมด้วยตนเอง ต่างจากเธรด ไฟเบอร์จะไม่ทำงานเอง คุณต้องส่งการควบคุมให้ไฟเบอร์อย่างชัดเจน และไฟเบอร์จะส่งการควบคุมกลับมา

  • แนวทางนี้เรียกว่าการทำงานสอดประสานแบบร่วมมือ
  • ไฟเบอร์สร้างและหยุดพักได้โดยใช้ทรัพยากรน้อย
  • ไฟเบอร์เป็นพื้นฐานของตัวสร้างข้อมูลและการรับส่งข้อมูลแบบอะซิงโครนัสใน Ruby

การสร้างและ resume

สร้างไฟเบอร์ด้วย Fiber.new แล้วเริ่มหรือทำงานต่อด้วย resume บล็อกจะทำงานต่อจนกว่าจะเสร็จหรือหยุดพัก

fiber = Fiber.new do
  puts "Inside the fiber"
end

fiber.resume
puts "Back in main"

การหยุดพักด้วยการส่งต่อการควบคุม

Fiber.yield จะหยุดไฟเบอร์ไว้และคืนการควบคุมให้ผู้ที่เรียก resume การเรียก resume ครั้งถัดไปจะทำงานต่อจากจุดหลังการส่งต่อการควบคุม

fiber = Fiber.new do
  puts "Step 1"
  Fiber.yield
  puts "Step 2"
end

fiber.resume
puts "Main between steps"
fiber.resume

การส่งค่าออก

อาร์กิวเมนต์ของ Fiber.yield จะกลายเป็นค่าที่ resume คืนกลับมา วิธีนี้ทำให้ไฟเบอร์สร้างลำดับค่าตามที่ต้องการได้

fiber = Fiber.new do
  Fiber.yield 10
  Fiber.yield 20
  30
end

puts fiber.resume
puts fiber.resume
puts fiber.resume

การส่งค่าเข้า

อาร์กิวเมนต์ของ resume จะกลายเป็นค่าที่ Fiber.yield ภายในไฟเบอร์คืนกลับมา การสื่อสารจึงไหลได้ทั้งสองทิศทาง

fiber = Fiber.new do
  got = Fiber.yield "ready"
  puts "Fiber received: " + got
end

puts fiber.resume
fiber.resume("hello")

ตัวนับไม่รู้จบ

เนื่องจากไฟเบอร์สามารถหยุดพักและทำงานต่อได้ จึงสามารถจำลองลำดับข้อมูลแบบขี้เกียจที่ไม่มีที่สิ้นสุดได้ โดยไม่ต้องคำนวณทุกค่าล่วงหน้า

counter = Fiber.new do
  n = 1
  loop do
    Fiber.yield n
    n += 1
  end
end

3.times { puts counter.resume }

การตรวจสอบว่ายังทำงานอยู่หรือไม่

Fiber#alive? บอกว่าไฟเบอร์ยังสามารถเรียกทำงานต่อได้หรือไม่ หากเรียกไฟเบอร์ที่จบการทำงานแล้ว จะเกิด FiberError

fiber = Fiber.new { puts "done" }
puts "Alive before: " + fiber.alive?.to_s
fiber.resume
puts "Alive after: " + fiber.alive?.to_s

ไฟเบอร์กับเธรด

ความแตกต่างที่สำคัญมีดังนี้

  • เธรดถูกจัดตารางโดยระบบขณะทำงาน ส่วนไฟเบอร์ถูกจัดตารางโดยคุณ
  • เธรดอาจถูกขัดจังหวะได้ทุกเมื่อ ส่วนไฟเบอร์จะสลับการทำงานเฉพาะที่ yield หรือ resume เท่านั้น
  • ไฟเบอร์หลีกเลี่ยงภาวะการแข่งขันได้ เพราะมีไฟเบอร์เพียงตัวเดียวที่ทำงาน และจุดสลับการทำงานระบุไว้อย่างชัดเจน

ตัวแจกแจงใช้ไฟเบอร์

ตัวแจกแจงแบบขี้เกียจของ Ruby สร้างขึ้นบนไฟเบอร์ ตัววนซ้ำภายนอกจะหยุดพักระหว่างค่าต่าง ๆ เช่นเดียวกับที่ไฟเบอร์ส่งค่าออกมา

enum = Enumerator.new do |y|
  y << 1
  y << 2
  y << 3
end

puts enum.next
puts enum.next

ไฟเบอร์กับการรับส่งข้อมูลแบบอะซิงโครนัส

Ruby สมัยใหม่มีจุดเชื่อมต่อสำหรับตัวจัดตารางไฟเบอร์ ไลบรารีอย่างเจมสำหรับงานอะซิงโครนัส async ใช้จุดเชื่อมต่อนี้ เมื่อไฟเบอร์หนึ่งรอการรับส่งข้อมูล ตัวจัดตารางจะทำให้ไฟเบอร์อื่นทำงานต่อโดยอัตโนมัติ

วิธีนี้ทำให้รองรับการรับส่งข้อมูลพร้อมกันจำนวนมากได้ โดยใช้โค้ดที่อ่านได้เหมือนโค้ดลำดับปกติ

ควรใช้ไฟเบอร์เมื่อใด

เลือกใช้ไฟเบอร์เมื่อคุณต้องการสิ่งต่อไปนี้

  • ตัวสร้างแบบขี้เกียจที่สร้างค่าตามต้องการ
  • ลำดับการควบคุมแบบโครูทีน
  • การสลับการทำงานที่ละเอียดและคาดเดาได้ โดยไม่ใช้ล็อก

สำหรับการทำงานสอดประสานทั่วไปในชีวิตประจำวัน เธรดหรือเจมสำหรับงานอะซิงโครนัส (ซึ่งใช้ไฟเบอร์อยู่เบื้องหลัง) จะใช้งานได้ง่ายกว่า

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับไฟเบอร์

ทบทวน: ไฟเบอร์

คุณได้เรียนรู้การทำงานสอดประสานแบบร่วมมือด้วยไฟเบอร์ดังนี้

  • Fiber.new ร่วมกับ resume จะเริ่มและทำงานต่อในไฟเบอร์
  • Fiber.yield จะหยุดพักและคืนการควบคุม
  • ค่าสามารถไหลได้ทั้งสองทิศทางผ่านอาร์กิวเมนต์ของ yield และ resume
  • ไฟเบอร์เป็นกลไกเบื้องหลังตัวแจกแจงและตัวจัดตารางการรับส่งข้อมูลแบบอะซิงโครนัส

ถัดไป: แร็กเตอร์ ซึ่งช่วยให้เกิดการทำงานแบบขนานอย่างแท้จริง

คำถามที่พบบ่อย

บทเรียน “ไฟเบอร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ไฟเบอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ไฟเบอร์”

การทำงานพร้อมกันแบบร่วมมือ คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ไฟเบอร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม

ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เธรด
  2. อธิบาย GVL
  3. ไฟเบอร์
  4. Ractor
← กลับไปที่ Ruby Academy