Middle
Kuo skiriasi asinchroniškumas nuo daugiagijumo?
sobes.tech AI
Atsakymas iš AI
Asinchroniškumas ir daugiagijų vykdymas yra du būdai vykdyti lygiagrečius uždavinius.
-
Daugiagijų vykdymas (multithreading) apima kelių gijų kūrimą ir vykdymą viename procese. Gijos vykdomos lygiagrečiai (daugialypėse sistemose) arba pseudolygiagrečiai (viengijėse sistemose per konteksto perjungimą). Tinka CPU intensyviems uždaviniams.
import threading import time def task(name): # Darbo imitacija time.sleep(1) print(f"Gija {name} baigta") gijos = [] for i in range(3): gija = threading.Thread(target=task, args=(i,)) gijos.append(gija) gija.start() # Gijos paleidimas for gija in gijos: gija.join() # Laukiama gijos pabaigos print("Visos gijos baigtos") -
Asinchroniškumas (asynchronous) grindžiamas vienos gijos naudojimu (arba keliomis mažomis gijomis) su įvykių valdomu architektūros modeliu. Vietoje blokuojančios operacijos (pvz., įvesties-išvesties) pabaigos, užduotis "perduoda" valdymą, leidžiant kitoms užduotims vykdyti, ir "tęsiama", kai operacija baigta. Tinka I/O ribotoms užduotims.
import asyncio import time async def async_task(name): # Asinchroninė blokuojanti operacija (pvz., tinklo užklausa) await asyncio.sleep(1) print(f"Asinchroninė užduotis {name} baigta") async def main(): užduotys = [] for i in range(3): užduotis = asyncio.create_task(async_task(i)) užduotys.append(užduotis) await asyncio.gather(*užduotys) # Laukiama asinchroninių užduočių pabaigos if __name__ == "__main__": asyncio.run(main()) print("Visos asinchroninės užduotys baigtos")
Pagrindiniai skirtumai:
| Aspektas | Daugiagijinis vykdymas (Threading) | Asinchroniškumas (Asyncio) |
|---|---|---|
| Vykdymas | Kelios gijos, lygiagrečiai arba pseudolygiagrečiai | Paprastai viena gija su perjungimu tarp užduočių |
| Modelis | Pagrįstas OS gijais, išstūmimo daugtaskumas | Pagrįstas įvykių ciklu, kooperatyvinis daugtaskumas |
| Sudėtingumas | Gijų valdymas, užraktai, GIL (Python) | Korutinos valdymas, await/async |
| Naudojimas | CPU ribotos užduotys | I/O ribotos užduotys |
| GIL (Python) | Ribojasi su realiu paralelizmu CPU ribotame kode | Nėra problemos I/O ribotoms užduotims |