Программалоодо параллелизм деген эмне?
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) болбошу үчүн.