Sobes.tech
Junior

Mi a párhuzamosság a programozásban?

sobes.tech MI

Válasz az MI-től

A párhuzamosság a programozásban több feladat egyidejű vagy látszólagos egyidejű végrehajtását jelenti, ami növeli az alkalmazások teljesítményét és reakcióképességét.

Többféle párhuzamosság létezik:

  • Többprocesszorosság (Multiprocessing): Több független folyamatot használ, mindegyik saját címtérrel. Ez megkerüli a GIL (Global Interpreter Lock) korlátozását a CPythonban, és CPU-intenzív feladatokra alkalmas.

    import multiprocessing
    import time
    
    def worker(num):
        """Valamilyen munka"""
        time.sleep(1)
        print(f'Worker {num} befejezte')
    
    if __name__ == '__main__':
        processes = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))
            processes.append(p)
            p.start()
    
        for p in processes:
            p.join()
        print("Minden munkás befejeződött")
    
  • Többszálúság (Multithreading): Egy folyamaton belül több szálat használ, amelyek megosztják a közös címtérét. A GIL miatt CPythonban a szálak nem futnak párhuzamosan több magon CPU-bound feladatoknál, de hatékonyak I/O-bound feladatoknál.

    import threading
    import time
    
    def worker(num):
        """Valamilyen munka"""
        time.sleep(1) # I/O művelet szimulálása
        print(f'Szál {num} befejezte')
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    print("Minden szál befejeződött")
    
  • Aszinkron programozás (Asyncio): Egy szálat és eseményhurkot (event loop) használ a feladatok kezelésére. Alkalmas nagy terhelésű I/O-bound alkalmazásokhoz és webkiszolgálókhoz. Nem blokkolja a végrehajtást I/O várakozás közben.

    import asyncio
    import time
    
    async def worker(num):
        """Valamilyen aszinkron munka"""
        await asyncio.sleep(1) # Aszinkron I/O várakozás
        print(f'Async worker {num} befejezte')
    
    async def main():
        tasks = []
        for i in range(5):
            task = asyncio.create_task(worker(i))
            tasks.append(task)
        await asyncio.gather(*tasks)
        print("Minden async munkás befejeződött")
    
    if __name__ == '__main__':
        asyncio.run(main())
    

A megközelítés kiválasztása a feladat jellemzőitől függ:

Megközelítés CPU-kötött feladatok I/O-kötött feladatok GIL Memóriahasználat
Többprocesszorosság Kiváló Kikerüli Nagy (saját folyamat)
Többszálúság Rossz (a GIL miatt) Kiváló Blokkolja Kisebb (közös folyamat)
Aszinkron Rossz Kiváló Nem blokkol Kisebb (egy szál)

A párhuzamosság óvatos szinkronizációs és erőforrás-kezelést igényel, hogy elkerüljük a versenyhelyzeteket (race conditions) és a holtpontokat (deadlocks).