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

เชี่ยวชาญ Queues ใน Ruby: คู่มือปฏิบัติสำหรับการจัดการงานที่มีประสิทธิภาพ

Queue (คิว) เหมือนรายชื่อรอ

จินตนาการว่าคุณกำลังรอคิวซื้อผลิตภัณฑ์ Apple ล่าสุด ได้ตั๋วหนัง หรือจ่ายค่าของชำ

นี่คือ queues!

คุณสามารถใช้ queues ในโปรเจกต์ Ruby ของคุณ

อย่างไร?

Queues อนุญาตให้คุณประมวลผลสิ่งต่างๆ ตามลำดับการมาถึง ดังนั้นพวกมันจึงช่วยได้สำหอย่างที่ต้องการให้สิ่งที่รอนานที่สุดได้รับความสำคัญก่อน

คุณสามารถนำไปใช้กับ:

  • จำลองคิวในโลกจริง
  • นำอัลกอริทึมเช่น Breadth-First Search (BFS) ไปใช้
  • ควบคุมการเข้าถึงทรัพยากรที่แบ่งปัน เช่น CPU, disks, printers เป็นต้น

ตอนนี้...

มาดูโค้ดบ้าง!

วิธี Implement Queue ใน Ruby

อาร์เรย์สามารถทำงานเหมือน Queue ได้ หากคุณใช้เมธอดที่ถูกต้อง

เมธอดเหล่านี้คือ:

  • unshift (หรือ prepend ด้วย Ruby 2.5+)
  • pop

เมื่อคุณ unshift คุณกำลังเพิ่มรายการหนึ่งเข้าไปในคิว

ตัวอย่าง:

queue = []
queue.unshift "apple"
queue.unshift "orange"
queue.unshift "banana"
# ["banana", "orange", "apple"]

เมื่อคุณ pop คุณเอารายการสุดท้ายออกจากคิว

นี่คือรายการถัดไปที่ควรประมวลผล

ตัวอย่าง:

queue.pop # "apple"
queue.pop # "orange"

คุณสามารถดูรายการสุดท้าย เพื่อดูว่า "ใครเป็นคนถัดไป" โดยไม่เอารายการนี้ออก

ตัวอย่าง:

queue[-1] # "banana"

การดำเนินการนี้เรียกว่า peek

Ruby Concurrent Queue

Ruby มีคลาส Queue ที่เหมาะสม thread-safe, blocking

คุณสามารถใช้คิวนี้เพื่อประสานงานในโปรแกรม multi-threaded

ตัวอย่าง:

que = Queue.new
que << 1
que << 2
que << 3

คุณสามารถเอารายการออกจากคิวนี้ด้วย pop:

que.pop # 1
que.pop # 2

หากคิวว่าง การเรียก pop จะทำให้เธรดปัจจุบันหลับ (sleep) และ รอจนกว่าจะมีสิ่ง gìถูกเพิ่มเข้าไปในคิว

นั่นคือความหมายของ "block" (บล็อก)

คุณสามารถหลีกเลี่ยงการบล็อกได้โดยส่ง true ไปที่ pop:

que.pop(true)

สิ่งนี้จะยกเว้น exception ThreadError: queue empty เมื่อคิวว่าง

วิธีใช้ Sized Queue

Sized queue เหมือนคิวทั่วไป แตมีขีดจำกัดขนาด

ตัวอย่าง:

que = SizedQueue.new(5)

เมื่อคิวเต็ม การ push (เหมือน <<) จะระงับเธรดปัจจุบันจนกว่าจะมีรายการถูกนำออกจากคิว

ตัวอย่าง:

que.push(:bacon)

คุณสามารถเลือกที่จะยกเว้น exception แทน โดยส่ง true เป็นอาร์กิวเมนต์:

que.push(:bacon, true)

สิ่งนี้ยกเว้น ThreadError: queue full

วิดีโอสอน

สรุป

คุณได้เรียนรู้เกี่ยวกับ Ruby queues แล้ว!

คุณสามารถใช้ queue เมื่อคุณต้องการประมวลผลงานในลำดับ FIFO (first-in-first-out) มีสองวิธี implement a queue คือการใช้อาร์เรย์ หรือใช้คลาส Queue

ขอบคุณที่อ่าน 🙂