Eşzamanlılık
- İngilizcesi
- Concurrency
- Okunuşu
- kınkörınsi
Günlük kullanımda iki ad da yaygın.
Kısaca
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.
Programlamada eşzamanlılık (concurrency) nedir?
Eşzamanlılık, bir programı birden çok görevle aynı anda başa çıkabilecek biçimde yapılandırmak, birini tamamen bitirip ardından diğerine başlamak yerine ihtiyaç oldukça aralarında geçiş yapmak demektir. Binlerce kullanıcıya hizmet veren bir web sunucusu, siz kaydırırken dosya indiren bir tarayıcı ve arka planda görüntü yükleyen bir telefon uygulaması eşzamanlılığa dayanır. Özellikle görevler bir ağ yanıtı ya da disk okuması gibi bir şey için beklerken zaman harcadığında yararlıdır.
Eşzamanlılığa ulaşmanın birkaç yolu vardır. İş parçacıkları (thread) işletim sisteminin tek bir program içinde ayrı talimat dizilerini çalıştırmasını sağlar; JavaScript ve Node.js'in kullandığı olay döngüleri (event loop) ise tek iş parçacığında aynı anda tek bir kod parçasını çalıştırır, ancak bir görev girdi/çıktı için beklediğinde diğer işe geçer. Diller ayrıca async/await, Go'daki goroutine'ler ve Erlang ile Elixir'deki aktörler (actor) gibi daha üst seviyeli araçlar da sunar.
Tek bir aşçının birkaç yemek pişirmesi eşzamanlılık için klasik bir benzetmedir: makarna kaynarken aşçı sebze doğrar, sonra sosu karıştırır ve her yemeği ilerletmeye devam eder. Paralellik ise her biri aynı anda bir yemek pişiren birkaç aşçıya sahip olmak gibidir, tıpkı birden çok CPU çekirdeğinin kodu aynı anda çalıştırması gibi. Eşzamanlılık aynı anda birçok şeyle uğraşmakla, paralellik ise aynı anda birçok şey yapmakla ilgilidir; bir program paralel olmadan da eşzamanlı olabilir.
Eşzamanlılık kendine özgü bir hata sınıfı getirir. Yarış durumu (race condition), sonucun görevlerin öngörülemez zamanlamasına bağlı olduğu durumdur; örneğin iki iş parçacığının aynı banka bakiyesini aynı anda güncellemesi ve güncellemelerden birinin kaybolması gibi. Geliştiriciler bunları kilitler (lock), atomik işlemler, mesaj geçişi ya da değişmez veriyle önler; ancak dikkatsiz kilitleme, iki görevin birbirini sonsuza dek beklediği bir kilitlenmeye (deadlock) yol açabilir.
Bir bakışta
Önemli noktalar
- Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerlemesini sağlar.
- İş parçacıkları, olay döngüleri, async/await, goroutine'ler ya da aktörlerle sağlanabilir.
- Paralellik, görevlerin birden çok çekirdekte tam anlamıyla aynı anda çalışması demektir; eşzamanlılık bunu gerektirmez.
- Paylaşılan değişebilir veriye erişim koordine edilmezse yarış durumları ve kilitlenmeler oluşabilir.
Örnek
// Concurrent: both requests are in flight at the same time
async function loadDashboard() {
const [user, orders] = await Promise.all([
fetch("/api/user").then((res) => res.json()),
fetch("/api/orders").then((res) => res.json()),
]);
return { user, orders };
}
// Sequential: the second request waits for the first to finish
async function loadDashboardSlowly() {
const user = await fetch("/api/user").then((res) => res.json());
const orders = await fetch("/api/orders").then((res) => res.json());
return { user, orders };
}Sık sorulan sorular
Eşzamanlılık ile paralellik arasındaki fark nedir?
Eşzamanlılık, ömürleri örtüşen birden çok görevi, herhangi bir anda yalnızca biri çalışıyor olsa bile yönetmekle ilgilidir. Paralellik ise birden çok görevi birden çok CPU çekirdeğinde tam anlamıyla aynı anda yürütmektir; eşzamanlı işi çalıştırmanın bir yoludur, ancak tek yolu değildir.
Yarış durumu (race condition) nedir?
Yarış durumu, sonucun eşzamanlı görevlerin çalışma zamanlamasına ya da sırasına bağlı olduğu bir hatadır. Örneğin iki görev bir sayacı okur, bir ekler ve aynı anda geri yazarsa artışlardan biri kaybolabilir.
JavaScript eşzamanlı mıdır?
Evet. JavaScript kodunuzu tek bir iş parçacığında çalıştırır, ancak olay döngüsü, beklerken başka kod çalıştırarak zamanlayıcılar ve ağ istekleri gibi birçok işlemi eşzamanlı olarak yönetmesini sağlar. Gerçek paralellik için tarayıcılar Web Worker'ları, Node.js ise worker thread'leri sunar.
Sık karşılaştırılanlar
İlgili sayfalar
- Async/AwaitProgramlamanın Temelleri, s. 2Async/await, asenkron kodu sıradan adım adım kod gibi okunur biçimde yazmayı sağlayan, her await'te bir promise ya da görev bitene dek duran sözdizimidir.
- PromiseProgramlamanın Temelleri, s. 46Promise, asenkron bir işlemin nihai sonucunu temsil eden bir nesnedir; iş bittiğinde kodun başarıya ya da hataya tepki vermesini sağlar.
- CallbackProgramlamanın Temelleri, s. 5Callback, başka bir fonksiyona argüman olarak verilen ve o fonksiyonun bir iş bittiğinde ya da bir olay gerçekleştiğinde sonradan çağırdığı fonksiyondur.
- Fonksiyonel programlamaProgramlamanın Temelleri, s. 21Fonksiyonel programlama, paylaşılan verileri değiştirmeyen saf fonksiyonlarla yazılım kurma stilidir; kodu daha öngörülebilir ve test etmesi kolay yapar.
- Node.jsBackend ve API'ler, s. 31Node.js, JavaScript'i tarayıcı dışında çalıştıran, en çok web sunucuları, API'ler ve komut satırı araçları için kullanılan açık kaynaklı çalışma ortamıdır.
- Mesaj KuyruğuBackend ve API'ler, s. 28Mesaj kuyruğu, bir servisten gelen mesajları bir başkası işlemeye hazır olana kadar saklayan ve sistemin parçalarını eşzamansız çalıştıran bir bileşendir.
- ParalellikProgramlamanın Temelleri, s. 44Paralellik, 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.
- GoProgramlama Dilleri, s. 13Go, sadelik ve hızlı derleme için tasarlanmış; çöp toplama ve goroutine'lerle yerleşik eşzamanlılık sunan, derlenen ve statik tipli bir dildir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin