Yan yana
EşzamanlılıkvsParalellik
Eşzamanlılık (concurrency) ile paralellik arasındaki fark nedir?
Güncellendi 2 dk okuma6 fark
Kısaca
Eşzamanlılık, birçok görevle örtüşen zamanlarda, tek çekirdekte bile ilgilenmektir; paralellik ise birden çok görevi ayrı çekirdeklerde aynı anda yürütmektir.
Eşzamanlılık
Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
Eşzamanlılık sayfasını okuParalellik
Paralellik, birkaç hesaplamayı birden çok CPU çekirdeğinde, GPU'da ya da makinede gerçekten aynı anda çalıştırmaktır; böylece büyük bir iş daha hızlı biter.
Paralellik sayfasını okuEşzamanlılık ve Paralellik karşılaştırması
| Özellik | Eşzamanlılık | Paralellik |
|---|---|---|
| Tanım | Birçok görevle örtüşen zamanlarda ilgilenmek | Birçok görevi aynı anda yapmak |
| Birden çok çekirdek gerekir mi | Hayır | Evet |
| İlgilendiği şey | Programın yapısı | Yürütme |
| Yardım ettiği | Bekleme: ağ, disk, kullanıcılar | CPU yoğun hesaplama |
| Tipik araçlar | Olay döngüleri, async/await, goroutine'ler | Thread'ler, süreçler, GPU'lar, SIMD |
| Örnek | Birçok bağlantıyı idare eden bir sunucu | Bütün çekirdeklerde video kodlamak |
Fark, açıklamalı
Bin bağlantıyı ele alan bir web sunucusu eşzamanlıdır: istekler aynı anda sürer ve biri veritabanını beklerken sunucu bir başkası üzerinde çalışır. Bu, görevler arasında geçiş yaparak tek bir CPU çekirdeğinde de olabilir. Paralellik ise işin gerçekten aynı anda çalışması demektir; her biri farklı bir görseli yeniden boyutlandıran sekiz çekirdek gibi.
Rob Pike bunu bilinen bir konuşma başlığında özetledi: concurrency is not parallelism (eşzamanlılık paralellik değildir). Eşzamanlılık yapıyla, yani aynı anda birçok şeyle ilgilenmekle; paralellik ise yürütmeyle, yani aynı anda birçok şeyi yapmakla ilgilidir. Eşzamanlı bir program donanım izin verirse paralel çalışabilir, ama çalışmak zorunda değildir.
Farklı sorunları çözerler. Eşzamanlılık, görevler ağları, diskleri ya da kullanıcıları beklerken zaman harcadığında yardım eder ve çoğu zaman olay döngüleri, async/await ya da goroutine'ler gibi hafif thread'lerle sağlanır. Paralellik ise video kodlama, veri işleme ya da makine öğrenmesi gibi CPU yoğun işlere, birden çok thread, süreç ya da GPU kullanarak yardım eder.
Sık yapılan bir yanlış, thread eklemenin kodu her zaman hızlandırdığını düşünmektir. Bekleme ağırlıklı işlerde async eşzamanlılık çoğu zaman çok sayıda thread'den daha verimlidir; CPython'da da global yorumlayıcı kilidi thread'lerin Python kodunu paralel çalıştırmasını engeller, bu yüzden CPU yoğun işler süreçler kullanır. Eşzamanlılık da paralellik de yarış durumları ve kilitlenmeler gibi riskler getirir.
Hangisini kullanmalısınız?
Eşzamanlılık şu durumlarda doğru seçim:
- Programınız çoğunlukla ağları, dosyaları ya da veritabanlarını bekliyor.
- Aynı anda birçok bağlantıyı ya da kullanıcıyı ele almanız gerekiyor.
- Görevler çalışırken kullanılabilir kalan, hızlı yanıt veren bir uygulama istiyorsunuz.
Paralellik şu durumlarda doğru seçim:
- İşiniz hesaplama ya da kodlama gibi CPU'ya bağlı.
- Görev bağımsız parçalara bölünebiliyor.
- Meşgul tutulacak birden çok çekirdeğiniz ya da GPU'nuz var.
Sık sorulan sorular
Bir program paralel olmadan eşzamanlı olabilir mi?
Evet. JavaScript'inki gibi tek thread'li bir olay döngüsü, bekleyen görevler arasında geçiş yaparak birçok görevi eşzamanlı ele alır, ama aynı anda yalnızca tek bir kod parçası çalıştırır.
async/await paralellik mi?
Hayır, bir eşzamanlılık aracıdır. Bir programın beklerken, genellikle tek bir thread üzerinde başka işler yapmasını sağlar; gerçek paralel iş thread'ler, süreçler ya da worker'lar gerektirir.
Python neden thread'leri paralel çalıştırmıyor?
Standart CPython'da aynı anda yalnızca tek bir thread'in Python kodu çalıştırmasına izin veren bir global yorumlayıcı kilidi vardır. Thread'ler beklemede yine yardım eder; paralelliği ise süreçler ya da daha yeni GIL'siz derlemeler sağlar.