Mis vahe on asünkroonsusel ja mitmetöötlusel?
sobes.tech AI
Vastus AI-lt
Asünkroonsus ja mitme niidiga töötamine on kaks lähenemisviisi paralleelsete ülesannete täitmiseks.
-
Mitme niidiga töötamine (multithreading) hõlmab mitme niidi loomist ja täitmist ühe protsessi raames. Niidid täidetakse paralleelselt (paljude tuumade süsteemides) või pseudoparalleelselt (ühe tuumaga süsteemides kontekstivahetuse kaudu). Sobib CPU-intensiivsete ülesannete jaoks.
import threading import time def task(name): # Töö imiteerimine time.sleep(1) print(f"Niit {name} lõpetas") niidid = [] for i in range(3): niit = threading.Thread(target=task, args=(i,)) niidid.append(niit) niit.start() # Niidi käivitamine for niit in niidid: niit.join() # Ootab niidi lõpetamist print("Kõik niidid on lõpetatud") -
Asünkroonsus (asynchronous) põhineb ühe niidi kasutamisel (või väikese arvu niitide) sündmuspõhise arhitektuuri kaudu. Selle asemel, et oodata blokeeriva operatsiooni (näiteks sisend-väljund) lõppu, "annab" ülesanne juhtimise edasi, võimaldades teistele ülesannetele jätkata, ja "jätkub" siis, kui operatsioon on lõpetatud. Sobib I/O-põhiste ülesannete jaoks.
import asyncio import time async def async_task(name): # Asünkroonne blokeeriv operatsioon (näiteks võrgupäring) await asyncio.sleep(1) print(f"Asünkroonne ülesanne {name} lõpetas") async def main(): ülesanded = [] for i in range(3): ülesanne = asyncio.create_task(async_task(i)) ülesanded.append(ülesanne) await asyncio.gather(*ülesanded) # Ootab asünkroonsete ülesannete lõppu if __name__ == "__main__": asyncio.run(main()) print("Kõik asünkroonsed ülesanded on lõpetatud")
Peamised erinevused:
| Aspekt | Mitme niidiga töötamine (Threading) | Asünkroonsus (Asyncio) |
|---|---|---|
| Täitmine | Mitme niidiga, paralleelselt või pseudoparalleelselt | Tavaliselt üks niit, ülesannete vahetamisega |
| Mudel | Põhineb OS niididel, eelnevalt välja lõigatud mitme ülesande täitmine | Põhineb sündmuste tsüklil, koostöövõimeline mitme ülesande täitmine |
| Komplekssus | Niitide haldamine, lukud, GIL (Pythonis) | Korutinate haldamine, await/async |
| Kasutus | CPU-ressursi nõudvad ülesanded | I/O-ressursi nõudvad ülesanded |
| GIL (Python) | Piirab reaalset paralleelsust CPU-ressursi nõudvas koodis | Ei ole probleem I/O-ressursi nõudvates ülesannetes |