Sobes.tech
Middle

Aký je rozdiel medzi asynchronitou a viacvláknovým spracovaním?

sobes.tech AI

Odpoveď od AI

Asynchrónnosť a viacvláknové spracovanie sú prístupy k vykonávaniu paralelných úloh.

  • Viacvláknové spracovanie (multithreading) predpokladá vytvorenie a vykonávanie viacerých vlákien v rámci jedného procesu. Vlákna sa vykonávajú paralelne (na viacjadrových systémoch) alebo pseudoparalelne (na jednojadrových systémoch cez prepínanie kontextu). Vhodné pre úlohy, ktoré intenzívne využívajú CPU.

    import threading
    import time
    
    def task(name):
        # Imitácia práce
        time.sleep(1)
        print(f"Vlákno {name} dokončené")
    
    vlákna = []
    for i in range(3):
        vlákno = threading.Thread(target=task, args=(i,))
        vlákna.append(vlákno)
        vlákno.start() # Spustenie vlákna
    
    for vlákno in vlákna:
        vlákno.join() # Čakanie na dokončenie vlákna
    
    print("Všetky vlákna sú dokončené")
    
  • Asynchrónnosť (asynchronous) je založená na použití jedného vlákna na vykonávanie (alebo malého počtu vlákien) s udalosťovo orientovanou architektúrou. Namiesto čakania na dokončenie blokujúcej operácie (napríklad vstup-výstup), úloha "predá" riadenie, umožňujúc iným úlohám bežať, a potom "pokračuje", keď je operácia dokončená. Vhodné pre I/O-bound úlohy.

    import asyncio
    import time
    
    async def async_task(name):
        # Imitácia asynchrónnej blokujúcej operácie (napríklad sieťovej požiadavky)
        await asyncio.sleep(1)
        print(f"Asynchrónna úloha {name} dokončená")
    
    async def main():
        úlohy = []
        for i in range(3):
            úloha = asyncio.create_task(async_task(i))
            úlohy.append(úloha)
    
        await asyncio.gather(*úlohy) # Čakanie na dokončenie asynchrónnych úloh
    
    if __name__ == "__main__":
        asyncio.run(main())
        print("Všetky asynchrónne úlohy sú dokončené")
    

Hlavné rozdiely:

Aspekt Viacvláknové spracovanie (Threading) Asynchrónnosť (Asyncio)
Vykonávanie Viaceré vlákna, paralelne alebo pseudoparalelne Obvykle jedno vlákno s prepínaním úloh
Model Založené na OS vláknach, preemptívny multitasking Založené na udalostnom cykle, kooperatívny multitasking
Složitosť Riadenie vlákien, zámky, GIL (v Pythone) Riadenie korutín, await/async
Použitie CPU-bound úlohy I/O-bound úlohy
GIL (Python) Obmedzuje reálny paralelizmus pre CPU-bound kód Nie je problém pre I/O-bound úlohy