Sobes.tech
Middle

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