대기열은 대기자 명단과 같습니다.
최신 Apple 제품을 구입하거나 영화 티켓을 구입하거나 식료품을 구입하기 위해 줄을 서서 기다리고 있다고 상상해 보십시오.
대기열입니다!
Ruby 프로젝트에서 대기열을 사용할 수 있습니다.
어떻게?
대기열을 사용하면 도착한 순서대로 처리할 수 있으므로 더 오래 기다려온 항목에 우선 순위를 부여해야 하는 모든 작업에 도움이 될 수 있습니다.
다음에 적용할 수 있습니다. :
- 실제 대기열 모델링
- BFS(Breadth-First Search)와 같은 알고리즘 구현
- CPU, 디스크, 프린터 등과 같은 공유 리소스에 대한 액세스를 제어합니다.
지금…
코드를 봅시다!
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 동시 대기열
Ruby에는 적절한 스레드 안전, 차단, Queue
가 있습니다. 수업.
다중 스레드 프로그램에서 작업을 조정하기 위해 이 대기열을 사용할 수 있습니다.
예 :
que = Queue.new que << 1 que << 2 que << 3
pop
을(를) 사용하여 이 대기열에서 항목을 가져올 수 있습니다. :
que.pop # 1 que.pop # 2
대기열이 비어 있으면 pop
호출 현재 스레드를 절전 모드로 전환하고 대기열에 항목이 추가될 때까지 기다립니다. .
이것이 "차단"의 의미입니다.
true
를 전달하여 차단을 피할 수 있습니다. pop
:
que.pop(true)
그러면 ThreadError: queue empty
가 발생합니다. 대기열이 비어 있는 경우 예외입니다.
크기 대기열을 사용하는 방법
크기 조정 대기열은 일반 대기열과 동일하지만 크기 제한이 있습니다.
예 :
que = SizedQueue.new(5)
대기열이 가득 차면 push
(<<
와 동일 ) 작업은 항목이 대기열에서 제거될 때까지 현재 스레드를 일시 중단합니다.
예 :
que.push(:bacon)
대신 true
를 전달하여 예외를 발생시키도록 선택할 수 있습니다. 인수로:
que.push(:bacon, true)
이것은 ThreadError: queue full
을 발생시킵니다. .
동영상 튜토리얼
요약
Ruby 대기열에 대해 배웠습니다!
FIFO(선입선출) 순서로 작업을 처리해야 할 때 대기열을 사용할 수 있습니다. . 대기열을 구현하는 두 가지 방법이 있습니다. , 배열 사용 또는 Queue
사용 수업.
읽어 주셔서 감사합니다. 🙂