Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 큐를 사용하는 방법

대기열은 대기자 명단과 같습니다.

최신 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 사용 수업.

읽어 주셔서 감사합니다. 🙂