Sobes.tech
Junior

Proqramlaşdırmada paralellik nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Proqramlaşdırmada paralelizm, bir neçə vəzifənin eyni vaxtda yerinə yetirilməsi və ya eyni vaxtda yerinə yetirilməsinin təsviri kimi qəbul edilir, bu da tətbiqlərin performansını və cavabvermə qabiliyyətini artırır.

Bir neçə paralelizm növü ayırd edilir:

  • Çox prosessli (Multiprocessing): Hər biri öz ünvan sahəsinə malik olan müstəqil bir neçə proses istifadə edir. Bu, CPython-də GIL (Global Interpreter Lock) məhdudiyyətini aşır və CPU intensiv tapşırıqlar üçün uyğundur.

    import multiprocessing
    import time
    
    def worker(num):
        """Bir iş"""
        time.sleep(1)
        print(f'İşçi {num} tamamlandı')
    
    if __name__ == '__main__':
        proseslər = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))
            proseslər.append(p)
            p.start()
    
        for p in proseslər:
            p.join()
        print("Bütün işçilər tamamlandı")
    
  • Çox ipli (Multithreading): Bir proses daxilində bir neçə ip istifadə edir, ümumi ünvan sahəsini paylaşır. CPython-də GIL səbəbindən, iplar CPU-bound tapşırıqlar üçün paralel işləməz, amma I/O-bound tapşırıqlar üçün effektivdir.

    import threading
    import time
    
    def worker(num):
        """Bir iş"""
        time.sleep(1) # I/O əməliyyatını simulyasiya edir
        print(f'İp {num} tamamlandı')
    
    ipler = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        ipler.append(t)
        t.start()
    
    for t in ipler:
        t.join()
    print("Bütün ipler tamamlandı")
    
  • Asinxron proqramlaşdırma (Asyncio): Bir ip və hadisələr döngüsü (event loop) istifadə edir, vəzifələrin yerinə yetirilməsini idarə edir. Yüksək yüklü I/O-bound tətbiqlər və veb serverlər üçün uyğundur. I/O gözləyərkən yerinə yetirməyi bloklamır.

    import asyncio
    import time
    
    async def worker(num):
        """Bir asinxron iş"""
        await asyncio.sleep(1) # Asinxron I/O gözləmə
        print(f'Asinxron işçi {num} tamamlandı')
    
    async def main():
        tasks = []
        for i in range(5):
            task = asyncio.create_task(worker(i))
            tasks.append(task)
        await asyncio.gather(*tasks)
        print("Bütün asinxron işçilər tamamlandı")
    
    if __name__ == '__main__':
        asyncio.run(main())
    

Yanaşma seçimi vəzifənin xarakterindən asılıdır:

Yanaşma CPU-bound vəzifələr I/O-bound vəzifələr GIL Yaddaş istifadəsi
Multiprocessing Əla Yaxşı Aşır Böyük (öz prosesi)
Multithreading Pis (GIL səbəbindən) Əla Bloklayır Kiçik (ümumi proses)
Asinxron Pis Əla Bloklamır Kiçik (bir ip)

Paralelizm, yarış şəraitlərinin və resursların diqqətlə idarə olunmasını tələb edir, bu da yarış şəraitləri və deadlock-lərin qarşısını almağa kömək edir.