Sobes.tech
Junior

Programlamada paralellik nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Programlamada paralelizm, aynı anda birkaç görevin yürütülmesi veya bunun gibi görünmesi anlamına gelir, bu da uygulamaların performansını ve yanıt verme kabiliyetini artırır.

Birkaç paralelizm türü ayırt edilir:

  • Çok işlemcilik (Multiprocessing): Her biri kendi adres alanına sahip bağımsız birkaç işlem kullanır. Bu, CPython'daki GIL (Global Interpreter Lock) sınırlamasını aşar ve CPU yoğun görevler için uygundur.

    import multiprocessing
    import time
    
    def worker(num):
        """Bir iş"""
        time.sleep(1)
        print(f'İşçi {num} tamamlandı')
    
    if __name__ == '__main__':
        processes = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))
            processes.append(p)
            p.start()
    
        for p in processes:
            p.join()
        print("Tüm işçiler tamamlandı")
    
  • Çok iş parçacığı (Multithreading): Aynı işlem içinde birkaç iş parçacığı kullanır, ortak adres alanını paylaşır. CPython'da GIL nedeniyle, iş parçacıkları CPU-bound görevler için paralel çalışmaz, ancak I/O-bound görevler için etkilidir.

    import threading
    import time
    
    def worker(num):
        """Bir iş"""
        time.sleep(1) # I/O işlemi simülasyonu
        print(f'İş Parçacığı {num} tamamlandı')
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    print("Tüm iş parçacıkları tamamlandı")
    
  • Asenkron programlama (Asyncio): Tek bir iş parçacığı ve olay döngüsü (event loop) kullanır, görevlerin yürütülmesini yönetir. Yüksek trafikli I/O-bound uygulamalar ve web sunucuları için uygundur. I/O beklerken yürütmeyi engellemez.

    import asyncio
    import time
    
    async def worker(num):
        """Bir asenkron iş"""
        await asyncio.sleep(1) # Asenkron I/O bekleme
        print(f'Asenkron 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("Tüm asenkron işçiler tamamlandı")
    
    if __name__ == '__main__':
        asyncio.run(main())
    

Yaklaşım seçimi, görevin doğasına bağlıdır:

Yaklaşım CPU-bound görevler I/O-bound görevler GIL Bellek kullanımı
Çok işlemcilik Mükemmel İyi Aşar Büyük (kendi işlemi)
Çok iş parçacığı Kötü (GIL nedeniyle) Mükemmel Engeller Küçük (ortak işlem)
Asenkron Kötü Mükemmel Engellemez Küçük (bir iş parçacığı)

Paralelizm, yarış koşulları ve kilitlenmeleri önlemek için senkronizasyon ve kaynakların dikkatli yönetimini gerektirir.