Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

สิ่งที่ทุกคนควรรู้เกี่ยวกับไฟเบอร์ในทับทิม

หากคุณต้องการได้รับประสิทธิภาพสูงสุดจากโปรเจ็กต์ 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 แล้ว! ไฟเบอร์ช่วยให้คุณสร้างหน่วยของโค้ดที่หยุดชั่วคราวและกลับมาทำงานต่อได้ตามต้องการ .

ตอนนี้ถึงตาคุณแล้วที่จะลองทำดู

ขอบคุณสำหรับการอ่าน!