Sobes.tech
Junior

Программалоодо параллелизм деген эмне?

sobes.tech AI

AIден жооп

Параллелизм программалоодо — бул бир нече тапшырмаларды бир убакта же алардын көрүнгөн бир убакта иштеши, бул колдонмолордун иштөө жөндөмдүүлүгүн жана жооп берүү жөндөмдүүлүгүн жогорулатууга мүмкүндүк берет.

Параллелизмдин бир нече түрлөрү бар:

  • Көппроцессорлуулук (Multiprocessing): Бир нече көзкарандысыз процесстерди колдонуу, ар бири өзүнүн адрес кеңейиши менен. Бул CPythonдеги GIL (Global Interpreter Lock) чектөөсүнөн чыгууга мүмкүндүк берет жана CPU-байланыштуу тапшырмаларга ылайыктуу.

    import multiprocessing
    import time
    
    def worker(num):
        """Айрым иш"""
        time.sleep(1)
        print(f'Жумушчу {num} аяктады')
    
    if __name__ == '__main__':
        процесстер = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))
            процесстер.append(p)
            p.start()
    
        for p in процесстер:
            p.join()
        print("Бардык жумушчулар аяктады")
    
  • Көпжиптүү иштетүү (Multithreading): Бир процесстин ичинде бир нече жипти колдонуу, алар жалпы адрес кеңейиши менен бөлүшөт. CPythonдеги GIL себептүү, жиптер CPU-байланыштуу тапшырмаларда бир нече ядродо параллелдүү иштебейт, бирок I/O-байланыштуу тапшырмалар үчүн эффективдүү.

    import threading
    import time
    
    def worker(num):
        """Айрым иш"""
        time.sleep(1) # I/O операциясынын имитациясы
        print(f'Жип {num} аяктады')
    
    жиптер = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        жиптер.append(t)
        t.start()
    
    for t in жиптер:
        t.join()
    print("Бардык жиптер аяктады")
    
  • Асинхрон программалоо (Asyncio): Бир жип жана окуялар цикли (event loop) аркылуу тапшырмаларды башкаруу. Жогорку жүктөмдүү I/O-байланыштуу колдонмолор жана веб-серверлер үчүн ылайыктуу. I/O күтүп жатканда иштөө токтогон эмес.

    import asyncio
    import time
    
    async def worker(num):
        """Айрым асинхрон иш"""
        await asyncio.sleep(1) # Асинхрондук күтүү I/O үчүн
        print(f'Async worker {num} аяктады')
    
    async def main():
        тапшырмалар = []
        for i in range(5):
            тапшырма = asyncio.create_task(worker(i))
            тапшырмалар.append(тапшырыма)
        await asyncio.gather(*тапшырыма)
        print("Бардык асинхрон жумушчулар аяктады")
    
    if __name__ == '__main__':
        asyncio.run(main())
    

Тандоо тапшырманын табигатына жараша болот:

Жол CPU-байланыштуу тапшырмалар I/O-байланыштуу тапшырмалар GIL Эстутү колдонуу
Көппроцессорлуулук Жакшы Жакшы Алып салат Улуу (өзүнүн процесси)
Көпжиптүү иштетүү Жаман (GIL себептүү) Жакшы Блоктоп турат Кичинекей (бир процесстин ичинде)
Асинхрон Жаман Жакшы Блоктоптогон Кичинекей (бир жип)

Параллелизмди сактоо үчүн синхрондоштуруу жана ресурстарды сак болуу керек, тайталас шарттары (race conditions) жана өлүм чекиттери (deadlocks) болбошу үчүн.