Sobes.tech
Junior

Ի՞նչ է ծրագրավորման մեջ պառալելիզմը։

sobes.tech AI

Պատասխան AI-ից

Համաժամանակությունը ծրագրավորման մեջ նշանակում է միաժամանակ մի քանի առաջադրանքների կատարման կամ դրանց պատրանքը, ինչը թույլ է տալիս բարձրացնել ծրագրերի արդյունավետությունը և արձագանքման արագությունը:

Կան մի քանի տեսակի համաժամանակություն:

  • Բազմամշակութային (Multiprocessing): Օգտագործում է մի քանի անկախ պրոցեսներ, յուրաքանչյուրը իր հասցեային տարածքով: Սա շրջանցում է GIL (Global Interpreter Lock) սահմանափակումը CPython-ում և հարմար է 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): Օգտագործում է մի պրոցեսի մեջ մի քանի թելեր, որոնք բաժանում են ընդհանուր հասցեային տարածք:

    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)՝ առաջադրանքների կառավարում:

    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 Հիշողության օգտագործում
Բազմամշակութային Հիանալի Լավ Աշխատում է շրջանցել Մեծ (անձնական պրոցես)
Բազմաշերտ (Multithreading) Ցածր (GIL-ի պատճառով) Հիանալի Բլոկավորում է Փոքր (համատեղ պրոցես)
Ասինխրոն Ցածր Հիանալի Չբլոկավորում Փոքր (մեկ թել)

Համաժամանակությունը պահանջում է զգուշավոր կառավարում՝ սինխրոնիզացիայի և ռեսուրսների, որպեսզի կանխվի մրցակցության պայմանները (race conditions) և մահովի կետերը (deadlocks):