Python’i queue mooduli juhend: põhialgsest kuni edasijõudnud

1. Mis on Python’i järjekord?

Järjekorra põhimõiste

Järjekord (Queue) on üks andmestruktuur, mis kasutab „FIFO (First In, First Out)“ lähenemist. See tähendab, et kõigepealt lisatud element töödeldakse kõigepealt välja võtmise järjekorras. See mehhanism on kasutusel arvutiteaduse ja programmeerimise paljudes valdkondades ning on andmete tõhusaks töötlemiseks hädavajalik tööriist. Näiteks kasutatakse järjekorda järgmistes olukordades.
  • Ülesannete ajastamine: Esmalt käivitatud ülesandeid täidetakse järjekorras.
  • Puhverdamine: Voogedastuse andmeid hoitakse järjekorras teatud koguses ja töödeldakse järjest.
  • Mitme lõimevaheline suhtlus: Kui mitu lõime töötlevad andmeid samaaegselt, saab järjekorda kasutada andmete järjekorra haldamiseks.
Python’i standardraamatukogus pakutav queue moodul on võimas tööriist, mis võimaldab neid järjekorra operatsioone lihtsalt teha. See moodul sisaldabemist lukustamismehhanismi, et lõimede vahel saaks andmeid turvaliselt vahetada.

2. Järjekorra kasutamine Pythonis

Järjekorra üldised kasutusviisid

Pythonis on palju olukordi, kus järjekorda kasutatakse. Eriti on järjekord kasulik järgmistes stsenaariumites.
  • Ülesannete ajastamine: Kui tuleb töödelda mitut ülesannet järjest, on see üks parimaid meetodeid. Näiteks, kui veebiserver saab suurt hulka päringuid, lisatakse need järjekorda järjestikku ja töödeldakse järjest, mis võimaldab ressursse tõhusalt kasutada.
  • Andmete puhverdamine: Voogtöötluse ajal toimib see puhverina, mis hoiab andmeid ajutiselt, kuni töötlemine jõuab sammu. Näiteks on see kasulik videovoogude või reaalajas andmetöötluse puhul.
  • Andmete jagamine mitme lõime vahel: Järjekorda saab kasutada tööriistana, mis võimaldab turvalist andmete vahetust erinevate lõimede vahel. Mitme lõimega programmides saab järjekorda kasutada ülesannete jaotamiseks lõimede vahel.
侍エンジニア塾

3. queue mooduli ülevaade

Klasside kirjeldus

Pythoniqueue moodulis on olemas kolm peamist klassi. Allpool tutvustame igaühe omadusi ja kasutamist.
  1. Queue (FIFO järjekord)
    • Kõige põhilisem järjekord, kus esimesena lisatud element võetakse esimesena välja. Kasutab FIFO (First In, First Out) põhimõtet.
    • Kasutusnäide:
    import queue q = queue.Queue() q.put("task1") q.put("task2") print(q.get()) ## "task1" väljastatakse
  2. LifoQueue (LIFO järjekord)
    • Nagu virna, võetakse viimati lisatud element esimesena välja. Kasutab LIFO (Last In, First Out) põhimõtet.
    • Kasutusnäide:
    import queue q = queue.LifoQueue() q.put("task1") q.put("task2") print(q.get()) ## "task2" väljastatakse
  3. PriorityQueue (prioriteedijärjekord)
    • Elemendid võetakse välja prioriteedi alusel. Madalam väärtus tähendab kõrgemat prioriteeti.
    • Kasutusnäide: import queue q = queue.PriorityQueue() q.put((1, "task1")) q.put((3, "task3")) q.put((2, "task2")) print(q.get()) ## "(1, 'task1')" väljastatakse
Nende klasside õige kasutamine vastavalt erinevatele olukordadele on oluline.

4. FIFO järjekorra rakendamise meetod

Põhiline kasutamine

FIFO queue on kõige levinum järjekorra vorm. queue.Queue kasutamisega saab seda lihtsalt rakendada. Allpool on näide FIFO järjekorra põhilistest toimingutest Pythonis.
import queue

## FIFO järjekorra loomine
q = queue.Queue()

## Elemendi lisamine järjekorda
q.put("apple")
q.put("banana")
q.put("cherry")

## Elemendi väljavõtmine järjekorrast
while not q.empty():
    print(q.get())
Sel koodis võetakse elemendid välja järjekorras "apple", "banana", "cherry" ja igaüks kuvatakse. empty() meetodit kasutatakse, kuni järjekord on tühi, korduvate protsesside tegemiseks.

Tegelik kasutusnäide

Näiteks veebiserveri poolt saadud päringute töötlemisel lisatakse iga päring järjekorda ja töödeldakse neid järjest. Sellistes olukordades toimib FIFO järjekord tõhusalt.

5. Täiustatud järjekorra toimingud

Järjekorra meetodid

Pythoni queue moodulis on palju mugavaid meetodeid, mis võimaldavad järjekorda tõhusalt hallata. Nende kasutamisega on võimalik teha keerukamaid toiminguid. Tutvustame mõnda peamist meetodit.
  1. qsize()
    • Tagastab järjekorras olevate elementide arvu. Kasulik, et kontrollida, kas järjekord on tühi.
    • Kasutusnäide:
    q = queue.Queue() q.put("task1") print(q.qsize()) ## 1 väljastatakse
  2. empty()
    • Määrab, kas järjekord on tühi. Tagastab True või False.
    • Kasutusnäide:
    q = queue.Queue() print(q.empty()) ## True väljastatakse
  3. full()
    • Määrab, kas järjekord on täis. Kehtib, kui maxsize on määratud.
    • Kasutusnäide:
    q = queue.Queue(maxsize=2) q.put("task1") q.put("task2") print(q.full()) ## True väljastatakse
  4. put(item)
    • Lisab elemendi järjekorda. Vaikimisi on seatud block=True, mis võib põhjustada blokeerimise. Võimalik on määrata ka aegumine, et piirata operatsiooni.
    • Kasutusnäide:
    q = queue.Queue() q.put("task1")
  5. get()
    • Võtab elemendi järjekorrast. Kui elementi pole olemas ja block=True, ootab, kuni element lisatakse.
    • Kasutusnäide: q = queue.Queue() q.put("task1") task = q.get() print(task) ## "task1" väljastatakse
Nende meetodite kasutamisega on võimalik järjekorda tõhusalt hallata ja teostada keerukamat andmehaldust.

6. Järjekorra erindite käitlemine

Järjekorra erindite käitlemine

queue moodulis on olemas erandid, mis võimaldavad tõhusalt töödelda üksuste väljavõtmise ajal tekkivaid vigu. Sellega saab veateate korral käitumist õigesti hallata.
  1. queue.Full
    • Tekib, kui järjekord on täis ja kutsutakse put().
    • Erindite käitlemise näide:
    try: q.put("task", block=False) except queue.Full: print("Järjekord on täis")
  2. queue.Empty
    • Tekib, kui järjekord on tühi ja kutsutakse get().
    • Erindite käitlemise näide: try: task = q.get(block=False) except queue.Empty: print("Järjekord on tühi")
Needid erandid on eriti olulised blokeerivaid operatsioone teostades. Soovitatav on rakendada õiget veahaldust, et programm ei peatu vea tõttu.

7. Pythoni mitme lõimiga järjekorra kasutamine

Mitme lõimiga ülesannete haldamine

Pythoni queue moodul on eriti kasulik mitme lõimiga keskkonnas. Järjekorra kasutamisega saab lõimede vahel turvaliselt andmeid jagada ja ülesandeid tõhusalt jaotada. Allpool on lihtne näide.
import queue
import threading

## Järjekorra loomine
q = queue.Queue()

## Töötaja lõime defineerimine
def worker():
    while True:
        item = q.get()
        print(f"Töötlemisel: {item}")
        q.task_done()

## Lõime käivitamine
threading.Thread(target=worker, daemon=True).start()

## Ülesannete lisamine järjekorda
for item in range(5):
    q.put(item)

## Ootamine, kuni kõik ülesanded on lõpetatud
q.join()
print("Kõik ülesanded on lõpetatud")
Selles programmis võtab mitu lõime samaaegselt ülesandeid järjekorrast, töötleb neid ja ootab, kuni kõik ülesanded on lõpetatud. Järjekorra kasutamisega saab vältida lõimedevahelist andmete konfliktide tekkimist ning teostada tõhusat paralleelset töötlemist.

8. Piiratud järjekorra (Bounded Queue) kasutamine

Mis on piiratud järjekord?

Piiratud järjekord (Bounded Queue) on järjekord, millele on määratud maksimaalne maht. See tüüpi järjekord aitab vältida ressursside raiskamist teatud tingimustel. Näiteks veebiserveri puhul, mis töötleb suurt hulka päringuid, saab piirangu kehtestamisega vältida süsteemi ülekoormamist. Piiratud järjekorral on järgmised peamised funktsioonid.
  1. Käitumine, kui elementi ei saa lisada Kui järjekord on täis ja proovite lisada uut elementi, käivitatakse järjekorra mahtu arvestav käitumine. Tavaliselt on kaks tüüpi käitumist.
  • Uue elemendi tagasilükkamine:Kui järjekord on täis, ei võeta enam elemente vastu ning uue elemendi lisamine lükatakse tagasi.
  • Vana elemendi ülekirjutamine:Eemaldatakse järjekorra vanim element ja sinna lisatakse uus element.
  1. Ressursside haldamine Piiratud järjekorda kasutatakse ressursside (mälu, CPU jne) tõhusaks haldamiseks. See aitab vältida ressursside raiskamist ja on kasulik ülesannete töötlemisel piiratud ulatuses.

Kasutusnäide

Allpool on näide piiratud järjekorra rakendamisest Pythonis.
import queue

## Piiratud järjekorra loomine
q = queue.Queue(maxsize=3)

## Lisame järjekorda elemendi
q.put("task1")
q.put("task2")
q.put("task3")

## Kui proovime lisada veel elemente, tekib blokeering või erind
try:
    q.put_nowait("task4")
except queue.Full:
    print("Järjekord on täis")
Selles näites on järjekorra maksimaalne suurus seatud 3-ks ja neljanda elemendi lisamisel tekib queue.Full erind. Nii on piiratud järjekord tõhus süsteemi ülekoormamise vältimiseks.

9. Kokkuvõte

Pythoni queue moodul võimaldab andmeid tõ hallata ning on väga kasulik tööriist mitmesugustes olukordades, nagu paralleeltöötlus ja lõimedevaheline suhtlus. Eriti võimaldab FIFO-queue, LIFO-queue ja prioriteetne järjekord paindlikku andmehaldust, mis sobib erinevate stsenaariumitega. Lisaks tugevdab erandite käitlemise ja piiratud järjekordade kasutuselevõtt veahaldust ja ressursside tõhusat haldamist. Kui kasutad Pythoni keerukate andmetöötluste jaoks, siis kindlasti kasuta neid funktsioone.
年収訴求