Python Kolejka: FIFO, LIFO Przykład

⚡ Inteligentne podsumowanie

Python Kolejka to liniowa struktura danych, która przechowuje elementy i zwalnia je w określonej kolejności. Moduł kolejki udostępnia warianty FIFO, LIFO i priorytetowe do zarządzania zadaniami, buforowania danych i bezpiecznej koordynacji pracy między wątkami.

  • 🔢 FIFO: Klasa Queue najpierw usuwa najstarszy element, co jest idealnym rozwiązaniem do planowania zadań i buforowania.
  • 🔁 LIFO: Klasa LifoQueue najpierw usuwa najnowszy element, zachowując się jak stos.
  • 📦 Metody podstawowe: put(), get(), qsize(), empty() i full() zarządzają elementami i raportują stan kolejki.
  • 🧵 Bezpieczne dla wątków: Moduł kolejki obsługuje blokowanie, dzięki czemu wiele wątków może bezpiecznie dzielić jedną kolejkę.
  • 🎯 Priorytet: PriorityQueue zwalnia elementy według priorytetu, a nie kolejności ich wstawiania.
  • 🤖 Pomoc AI: Asystenci AI generują kod kolejki i wyjaśniają kompromisy FIFO i LIFO na podstawie prostego komunikatu.

Python Kolejka FIFO LIFO

Czym jest Python Kolejka?

Kolejka to kontener przechowujący dane. Dane wprowadzone jako pierwsze zostaną usunięte w pierwszej kolejności, dlatego kolejka nazywana jest także „pierwsze weszło, pierwsze wyszło” (FIFO). Kolejka ma dwa końce z przodu i z tyłu. Elementy są wprowadzane od tyłu i wyjmowane od przodu.

W jaki sposób Python Praca w kolejce?

Kolejkę można łatwo porównać z przykładem z życia codziennego: kolejką osób czekających w kolejce przy kasie biletowej, osoba stojąca pierwsza otrzyma bilet jako pierwsza, po niej następna osoba i tak dalej. Ta sama logika dotyczy również struktury danych kolejki.

Oto schematyczne przedstawienie kolejki:

Python Praca w kolejce

Tył reprezentuje punkt, w którym elementy są wstawiane do kolejki. W tym przykładzie wartością jest 7.

Przód reprezentuje punkt, w którym elementy z kolejki zostaną usunięte. Jeśli usuniesz element z kolejki, pierwszym elementem, który otrzymasz, będzie 1, jak pokazano na rysunku.

Pozycja 1 jako pierwsza została wstawiona do kolejki, a przy jej usuwaniu jako pierwsza wyszła. Stąd kolejka nazywa się FIRST IN FIRST OUT (FIFO)

Python Praca w kolejce

W kolejce elementy są usuwane po kolei i nie można ich usunąć pomiędzy nimi. Po prostu nie możesz losowo usunąć pozycji 5 z kolejki. Aby to zrobić, będziesz musiał usunąć wszystkie pozycje przed 5. Pozycje w kolejce zostaną usunięte w kolejności, w jakiej zostały wstawione.

Rodzaje kolejek Python

Istnieją głównie dwa rodzaje kolejek Python:

  • Kolejka First in First out: W tym celu element, który pojawi się jako pierwszy, będzie pierwszym, który wyjdzie. Aby pracować z FIFO, musisz wywołać Kolejka() klasa z modułu kolejki.
  • Ostatni w kolejce, pierwszy na wyjściu: Tutaj element wprowadzony jako ostatni będzie pierwszym, który wyjdzie. Aby pracować z LIFO, musisz wywołać LifoQueue() class z modułu kolejki.

Python Instalacja kolejki

Praca z kolejką w Pythonie jest bardzo łatwa. Oto kroki, które należy wykonać, aby skorzystać z kolejki w kodzie.

Krok 1) Wystarczy zaimportować moduł kolejki, jak pokazano poniżej:

import queue

Moduł jest domyślnie dostępny z Pythonem i nie potrzebujesz żadnej dodatkowej instalacji, aby rozpocząć pracę z kolejką. Istnieją 2 typy kolejek FIFO (pierwszy na wejściu, pierwszy na wyjściu) i LIFO (ostatni na wejściu, pierwszy na wyjściu).

Krok 2) Aby pracować z kolejką FIFO, wywołaj klasę Queue, korzystając z zaimportowanego modułu kolejki, jak pokazano poniżej:

import queue
q1 = queue.Queue()

Krok 3) Aby pracować z kolejką LIFO, wywołaj klasę LifoQueue(), jak pokazano poniżej:

import queue
q1 = queue.LifoQueue()

Metody dostępne wewnątrz klas Queue i LifoQueue

Poniżej przedstawiono ważne metody dostępne w klasie Queue i LifoQueue:

  • umieścić (przedmiot): Spowoduje to umieszczenie elementu w kolejce.
  • Dostawać(): Spowoduje to zwrócenie elementu z kolejki.
  • pusty(): Zwróci wartość true, jeśli kolejka jest pusta, i false, jeśli elementy są obecne.
  • qrozmiar(): zwraca rozmiar kolejki.
  • pełny(): zwraca wartość true, jeśli kolejka jest pełna, w przeciwnym wypadku zwraca wartość false.

Przykład kolejki „pierwszy na wejściu, pierwszy na wyjściu”.

W przypadku zasady „pierwsze weszło, pierwsze wyszło” element, który wystartuje jako pierwszy, jako pierwszy wyjdzie.

Dodaj i umieść w kolejce

Popracujmy nad przykładem dodania elementu do kolejki. Aby rozpocząć pracę z kolejką, należy najpierw zaimportować kolejkę modułu, jak pokazano w poniższym przykładzie.

Aby dodać element, możesz skorzystać z metody put(), jak pokazano w przykładzie:

import queue
q1 = queue.Queue()
q1.put(10) #this will additem 10 to the queue.

Domyślnie rozmiar kolejki jest nieskończony i możesz dodać do niej dowolną liczbę pozycji. Jeśli chcesz zdefiniować rozmiar kolejki, możesz to zrobić w następujący sposób

import queue
q1 = queue.Queue(5) #The max size is 5.
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print(q1.full()) # will return true.

Wyjście:

True

Teraz rozmiar kolejki wynosi 5 i nie zajmie ona więcej niż 5 pozycji, a metoda q1.full() zwróci wartość true. Dodanie kolejnych elementów nie spowoduje dalszego wykonania kodu.

Usuń element z kolejki

Aby usunąć element z kolejki, możesz użyć metody zwanej get(). Ta metoda pozwala na wywołanie elementów z kolejki.

Poniższy przykład pokazuje, jak usunąć element z kolejki.

import queue
q1 = queue.Queue()
q1.put(10)

item1 = q1.get()

print('The item removed from the queue is ', item1)

Wyjście:

The item removed from the queue is  10

Przykład kolejki „Ostatni na wejściu, pierwszy na wyjściu”.

W przypadku ostatniego w kolejce pierwszego wyjścia, element wprowadzony jako ostatni będzie pierwszym, który wyjdzie.

Aby pracować z LIFO, czyli być ostatnim w pierwszej kolejce wyjściowej, musimy zaimportować moduł kolejki i skorzystać z metody LifoQueue().

Dodaj i umieść w kolejce

Tutaj zrozumiemy, jak dodać element do kolejki LIFO.

import queue
q1 = queue.LifoQueue()
q1.put(10)

Musisz użyć metody put() na LifoQueue, jak pokazano w powyższym przykładzie.

Usuń element z kolejki

Aby usunąć element z kolejki LIFOqueue, możesz skorzystać z metody get().

import queue
q1 = queue.LifoQueue()
q1.put(10)

item1 = q1.get()

print('The item removed from the LIFO queue is ', item1)

Wyjście:

The item removed from the LIFO queue is  10

Dodaj więcej niż 1 element do kolejki

W powyższych przykładach widzieliśmy, jak dodać pojedynczy element i usunąć element dla FIFO i LIFOqueue. Teraz zobaczymy, jak dodać więcej niż jeden element, a także go usunąć.

Dodaj i umieść element w kolejce FIFO

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Usuń element z kolejki FIFO

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

Wyjście:

The value is  0
The value is  1
The value is  2
The value is  3
The value is  4
The value is  5
The value is  6
The value is  7
The value is  8
The value is  9
The value is  10
The value is  11
The value is  12
The value is  13
The value is  14
The value is  15
The value is  16
The value is  17
The value is  18
The value is  19

Dodaj i umieść element w kolejce LIFOqueue

import queue
q1 = queue.LifoQueue()
for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Usuń element z kolejki LIFOqueue

import queue
q1 = queue.LifoQueue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

Wyjście:

The value is  19
The value is  18
The value is  17
The value is  16
The value is  15
The value is  14
The value is  13
The value is  12
The value is  11
The value is  10
The value is  9
The value is  8
The value is  7
The value is  6
The value is  5
The value is  4
The value is  3
The value is  2
The value is  1
The value is  0 

Kolejka sortowania

Poniższy przykład ilustruje sortowanie kolejki. Do sortowania wykorzystano algorytm sortowania bąbelkowego.

import queue
q1 = queue.Queue()
#Addingitems to the queue
q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

#using bubble sort on the queue
n =  q1.qsize()
for i in range(n):
    x = q1.get() # the element is removed
    for j in range(n-1):
        y = q1.get() # the element is removed
        if x > y :  
            q1.put(y)   #the smaller one is put at the start of the queue
        else:
            q1.put(x)  # the smaller one is put at the start of the queue
            x = y     # the greater one is replaced with x and compared again with nextelement
    q1.put(x)

while (q1.empty() == False): 
print(q1.queue[0], end = " ")  
        q1.get()

Wyjście:

3 4 5 10 11 21

Revkolejka do kasowania

Aby odwrócić kolejkę, możesz skorzystać z innej kolejki i rekurencji.

Poniższy przykład pokazuje, jak odwrócić kolejkę.

Przykład:

import queue
q1 = queue.Queue()

q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

def reverseQueue (q1src, q2dest) :  
    buffer = q1src.get()
    if (q1src.empty() == False) :
reverseQueue(q1src, q2dest)      #using recursion
    q2dest.put(buffer)
return q2dest

q2dest = queue.Queue()
qReversed = reverseQueue(q1,q2dest)

while (qReversed.empty() == False): 
print(qReversed.queue[0], end = " ")  
        qReversed.get()

Wyjście:

10 3 21 4 5 11

FAQ

Kolejka to FIFO, więc najstarszy element opuszcza kolejkę jako pierwszy, natomiast stos to LIFO, gdzie najnowszy element opuszcza kolejkę jako pierwszy. PythonModuł kolejki oferuje kolejkę dla zachowania FIFO i LifoQueue dla zachowania stosu.

Tak. Queue, LifoQueue i PriorityQueue zostały stworzone z myślą o programach wielowątkowych i obsługują wewnętrzne blokowanie, dzięki czemu wiele wątków producenta i konsumenta może dzielić jedną kolejkę bez ryzyka wyścigu lub uszkodzenia danych.

queue.Queue jest bezpieczna wątkowo i zaprojektowana do wątków producent-konsument. collections.deque to szybsza uniwersalna kolejka dwustronna dla kodu jednowątkowego, obsługująca szybkie dołączanie i pobieranie z obu końców.

Kolejka PriorityQueue zwalnia elementy w kolejności priorytetowej, a nie w kolejności wstawiania. Umieszczasz krotki (priorytet, dane), a funkcja get() zwraca najpierw najniższy numer priorytetu, co jest odpowiednie dla harmonogramów i algorytmów najkrótszej ścieżki.

Domyślnie get() blokuje i czeka, aż element będzie dostępny. Przekaż block=False lub użyj get_nowait(), aby natychmiast zgłosić wyjątek queue.Empty zamiast czekać na nowy element.

Przekaż parametr maxsize do konstruktora, na przykład queue.Queue(5). Gdy kolejka jest pełna, put() blokuje się, aż zwolni się miejsce, a full() zwraca True. Wartość maxsize równa 0 oznacza nieograniczoną kolejkę.

Asystenci AI generują kod kolejki producent-konsument, wyjaśniają kompromisy między metodami FIFO a LIFO i sugerują, czy queue.Queue, deque, czy asyncio.Queue pasuje do Twojego przypadku. Pomagają również wykrywać blokady i brakujące wywołania task_done().

Tak. GitHub Copilot automatycznie uzupełnia konfigurację kolejki, pętle put() i get() oraz wątki robocze z komentarza. Narzędzia agentowej sztucznej inteligencji idą o krok dalej, refaktoryzując blokujący kod do asyncio.Queue i dodając obsługę błędów w całym pliku.

Podsumuj ten post następująco: