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
ขอบคุณที่อ่าน 🙂