หากคุณต้องการได้รับประสิทธิภาพสูงสุดจากโปรเจ็กต์ Ruby ของคุณ เราต้องสำรวจเส้นใยและวิธีการทำงาน
มาเริ่มกันด้วยคำถามง่ายๆ…
ไฟเบอร์คืออะไร
ไฟเบอร์เป็นผู้ปฏิบัติงาน พวกเขาเรียกใช้โค้ดและติดตามความคืบหน้าของตนเอง กล่าวอีกนัยหนึ่ง เส้นใยเป็นกลไกการทำงานพร้อมกัน
ใช่!
เช่นเดียวกับเธรด ด้วยความแตกต่างที่ให้คุณควบคุมเส้นใยได้ดีกว่าเส้นด้าย
คุณควบคุมได้ดีกว่าในแง่ไหน
อืม
ระบบปฏิบัติการของคุณตัดสินใจว่าจะเรียกใช้เธรดเมื่อใดและเมื่อใดควรหยุดชั่วคราว
ไม่ใช่กรณีที่มีเส้นใย!
คุณต้องบอกไฟเบอร์ว่าเมื่อไหร่ควรวิ่ง &เมื่อไรควรหยุด
เส้นใยกับเส้นด้าย
เธรดรู้สึกเหมือนกำลังทำงานอยู่เบื้องหลัง กำลังทำสิ่งที่ต้องการ
ไฟเบอร์ไม่รองรับ
ขณะที่ไฟเบอร์กำลังทำงาน มันจะกลายเป็นโปรแกรมหลักจนกว่าคุณจะหยุดทำงาน
มาดูตัวอย่างโค้ดกัน!
การใช้ไฟเบอร์:ตัวอย่าง
สร้างไฟเบอร์ด้วย Fiber.new
&บล็อก
ตัวอย่าง :
f = Fiber.new { puts 1 }
จากนั้นเรียกใช้ไฟเบอร์โดยใช้ resume
วิธีการ
ถูกใจสิ่งนี้ :
f.resume
พิมพ์ 1
&มันคืนการควบคุมให้กับโปรแกรมหลักของคุณ
แต่จะหยุดไฟเบอร์ได้อย่างไร
ด้วย Fiber.yield
ซึ่งแตกต่างจาก yield
คีย์เวิร์ดที่ใช้สำหรับบล็อก
ตัวอย่าง :
f = Fiber.new { puts 1; Fiber.yield; puts 2 } f.resume # 1 f.resume # 2
นี่จะพิมพ์ 1
หลังจากเริ่มไฟเบอร์ด้วย resume
แล้วหยุด
หากคุณโทร resume
อีกครั้ง…
มันจะดำเนินต่อไปจากที่ที่มันทิ้งไว้ &พิมพ์ 2
.
หมายเหตุ :การกลับมาทำงานไฟเบอร์นี้อีกครั้งส่งผลให้
FiberError: dead fiber called
เพราะไม่มีโค้ดให้รันอีกแล้ว
นี่คือเหตุผลที่เส้นใยมีประโยชน์!
กำลังโทร Fiber.yield
ภายในไฟเบอร์ก็เหมือนการกดปุ่มหยุดชั่วคราว ให้คุณหยุดกลางลูปหรือโค้ดใดๆ ที่คุณเขียนในบล็อกของไฟเบอร์
ไฟเบอร์ &ลูป:ลำดับที่ไม่มีที่สิ้นสุด
เราสามารถใช้เอฟเฟกต์ "ปุ่มหยุดชั่วคราว" นี้เพื่อสร้างลำดับที่ไม่มีที่สิ้นสุด
ส่วนผสม :
- ไฟเบอร์
- ลูป
- เคาน์เตอร์
ตัวอย่างเช่น หมายเลขแฟกทอเรียล :
factorial = Fiber.new do count = 1 loop do Fiber.yield (1..count).inject(:*) count += 1 end end
คุณสามารถใช้ไฟเบอร์นี้ได้บ่อยเท่าที่ต้องการด้วย resume
วิธีเพื่อให้ได้ตัวเลขถัดไปในลำดับ
ตัวอย่าง :
Array.new(5) { factorial.resume } # [1, 2, 6, 24, 120]
เยี่ยมเลย!
ไฟเบอร์และ IO:การทำงานของอะซิงโครนัส
ไฟเบอร์เร็วกว่าและมีประสิทธิภาพมากกว่าเธรดสำหรับสิ่งที่คุณต้องรอ เช่น การเชื่อมต่อเครือข่าย
ทำไม?
เนื่องจากเส้นใยทำให้เกิดการสลับบริบทน้อยลง
สวิตช์บริบทคือเมื่อ CPU เปลี่ยนจากงานปัจจุบันเป็นงานอื่น
มีค่าใช้จ่ายเล็กน้อย แต่เพิ่มขึ้น!
ฉันทำการทดสอบโดยใช้เครื่องมือ perf ของ Linux และพบว่าในแอปพลิเคชัน Ruby แบบธรรมดา ไฟเบอร์สร้างการสลับบริบทน้อยกว่าเธรด 3 เท่า
ฟังดูดีไหม
เริ่มใช้ไฟเบอร์ได้ทันที :
- ด้วย
IO.select
method + รูปแบบการออกแบบเครื่องปฏิกรณ์ - ด้วยอัญมณี async
- กับเซิร์ฟเวอร์แอปพลิเคชันเหยี่ยว
จำไว้…
ไม่มีกระสุนวิเศษ แต่ควรทดสอบและดูว่าไฟเบอร์ทำอะไรให้คุณได้บ้าง 🙂
สรุป
คุณได้เรียนรู้เกี่ยวกับไฟเบอร์ใน Ruby แล้ว! ไฟเบอร์ช่วยให้คุณสร้างหน่วยของโค้ดที่หยุดชั่วคราวและกลับมาทำงานต่อได้ตามต้องการ .
ตอนนี้ถึงตาคุณแล้วที่จะลองทำดู
ขอบคุณสำหรับการอ่าน!