Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành Thạo Hàng Đợi (Queue) Trong Ruby: Hướng Dẫn Thực Tế Quản Lý Nhiệm Vụ Hiệu Quả

Một hàng đợi giống như danh sách chờ.

Hãy tưởng tượng bạn đang chờ trong hàng để mua sản phẩm Apple mới nhất, lấy vé xem phim, hoặc trả tiền mua đồ tạp hóa.

Đây là hàng đợi!

Bạn có thể dùng hàng đợi trong dự án Ruby của mình.

Làm thế nào?

Hàng đợi cho phép bạn xử lý thứ theo thứ tự đến, nên chúng hữu ích cho bất cứ điều gì yêu cầu ưu tiên cho thứ đã chờ lâu hơn.

Bạn có thể áp dụng cho:

  • Mô hình hàng đợi thực tế
  • Triển khai thuật toán như Breadth-First Search (BFS)
  • Kiểm soát truy cập tài nguyên chia sẻ, như CPU, đĩa, máy in, v.v.

Bây giờ…

Hãy xem code!

Cách Triển Khai Hàng Đợi Trong Ruby

Một mảng có thể hành xử như Queue nếu bạn dùng đúng phương thức.

Các phương thức là:

  • unshift (hoặc prepend với Ruby 2.5+)
  • pop

Khi bạn unshift, bạn thêm một mục vào hàng đợi.

Ví dụ:

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

Khi bạn pop, bạn loại bỏ mục cuối từ hàng đợi.

Đây là mục tiếp theo nên được xử lý。

Ví dụ:

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

Bạn có thể nhìn mục cuối, để xem „ai tiếp theo“ mà không loại bỏ mục này。

Ví dụ:

queue[-1] # "banana"

Thao tác này gọi là peek.

Ruby Concurrent Queue (Hàng Đợi Đồng Thời)

Ruby có lớp Queue đúng đắn, an toàn luồng (thread-safe), chặn (blocking).

Bạn có thể dùng hàng đợi này để phối hợp công việc trong chương trình đa luồng.

Ví dụ:

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

Bạn có thể lấy mục khỏi hàng đợi này với pop:

que.pop # 1
que.pop # 2

Nếu hàng đợi rỗng, gọi pop sẽ làm luồng hiện tại ngủ & chờ cho đến khi có thứ thêm vào hàng đợi.

Đó là ý của „block“.

Bạn có thể tránh chặn bằng cách truyền true cho pop:

que.pop(true)

Điều này ném ngoại lệ ThreadError: queue empty khi hàng đợi rỗng.

Cách Dùng Hàng Đợi Có Kích Thước (Sized Queue)

Hàng đợi có kích thước giống hàng đợi thường nhưng có giới hạn kích thước.

Ví dụ:

que = SizedQueue.new(5)

Khi hàng đợi đầy, thao tác push (giống <<) sẽ treo luồng hiện tại cho đến khi mục được lấy ra khỏi hàng đợi.

Ví dụ:

que.push(:bacon)

Bạn có thể chọn ném ngoại lệ thay vào đó, truyền true làm tham số:

que.push(:bacon, true)

Điều này ném ThreadError: queue full。

Video Hướng Dẫn

Tóm Tắt

Bạn đã học về hàng đợi Ruby!

Bạn có thể dùng hàng đợi khi cần xử lý công việc theo thứ tự FIFO (first-in-first-out). Có hai cách triển khai hàng đợi, dùng mảng, hoặc dùng lớp Queue.

Cảm ơn bạn đã đọc. 🙂