giriiş
Eşzamanlı ve eşzamansız programlama modelleri arasında karar vermek, yazılım geliştirmede yalnızca teknik bir konu değildir; uygulamaların birlikte nasıl çalıştığını, görevleri nasıl tamamladığını ve kullanıcı girdisine nasıl yanıt verdiğini etkiler. Doğru modeli seçmenin, özellikle iki paradigmayı karşılaştırırken, bir projenin başarısını veya başarısızlığını belirleyebileceğini unutmayın. Bu makalenin amacı, eşzamansız ve eşzamansız programlama arasında net bir ayrım yaparak ve avantajlarını, dezavantajlarını ve en iyi uygulamalarını açıklayarak bu kavramlar etrafındaki kafa karışıklığını gidermektir. Geliştiriciler, her stratejiyi derinlemesine anlayarak akıllıca kararlar alabilir ve yaklaşımlarını uygulamalarının ihtiyaçlarına göre uyarlayabilirler.
Eşzamanlı Programlamayı Anlamak
Eşzamanlı programlama nedir?
Eşzamanlı programlamada görevler sırayla gerçekleştirilir. Tıpkı bir kitap gibi, en baştan başlar ve her kelimeyi ve satırı okursunuz. Eşzamanlı programlama, bir sonraki görev başlamadan önce her görevin tamamlanmasını gerektirir. Kontrol akışı öngörülebilir ve basittir.
Bir görev çok uzun sürerse sistem takılabilir veya yanıt vermeyebilir. Engelleme davranışı, eş zamanlı programlamanın öne çıkan özelliklerinden biridir.
Nasıl çalışır?
Eşzamanlı programlama modeli, işlemleri doğrusal olarak gerçekleştirir. Bu süreç aşağıdaki şekilde basitleştirilmiştir:
- Programın yürütülmesi sıralıdır.
- Görevler kod sırasına göre yürütülür.
- Yukarıdan aşağıya doğru her satır kod çalıştırılır.
Bir görev uzun zaman alıyorsa, örneğin büyük bir dosyayı okumak veya insan girdisini beklemek gibi, görev tamamlanana kadar program bloke olur. Eşzamanlı programlama bloke olur.
Eşzamanlı programlamanın öne çıktığı kullanım durumları
Eşzamanlı programlama, görevlerin belirli bir sırayla yürütülmesi gereken senaryolarda özellikle kullanışlıdır. Örneğin, bir kek pişirmek istiyorsanız, malzemeleri karıştırmadan fırına koyamazsınız. Benzer şekilde, bir uygulamada, verileri işleyebilmeniz için önce bir veritabanından veri almanız gerekebilir.
Örnek: Bir dosyayı sırayla okuma
İşte dosya okuma bağlamında eşzamanlı programlamanın nasıl çalıştığına dair bir örnek:
function readFilesSequentially(fileList) {
for each file in fileList {
content = readFile(file) // This is a blocking operation
process(content)
}
}Bu sözde kodda, fonksiyon readFile(dosya) Bu, eşzamanlı bir işlemdir. İşlev süreç(içerik) Değin readFile(dosya) Dosyayı tamamen okumayı bitirmedi, yürütülmeyecek. Bu, eşzamanlı programlamanın sıralı ve bloklayıcı yapısının açık bir göstergesidir.
Asenkron Programlama İncelemesi
Asenkron programlama nedir?
Eşzamansız programlama, görevlerin sıralı olarak değil, eş zamanlı olarak yürütülmesine olanak tanıyan bir paradigmadır. Bu, program yürütmenin bir sonraki göreve geçmeden önce bir görevin tamamlanmasını beklemesine gerek olmadığı anlamına gelir. Tıpkı bir büfede olmak gibi - başlamadan önce birinin yemeğini bitirmesini beklemek zorunda değilsiniz.
Eşzamansız programlamada, görevler genellikle başlatılır ve ardından diğer görevlerin çalışmasına izin vermek üzere bir kenara bırakılır. Ana görev tamamlandığında, kaldığı yerden devam edilebilir. Bu engellememe özelliği, eşzamansız programlamanın temel özelliklerinden biridir.
Nasıl çalışır?
Eş zamanlı yürütme: Eşzamansız programlamanın temel özelliklerinden biri, birden fazla görevi eş zamanlı olarak yürütebilme yeteneğidir. Bu, özellikle görevlerin bağımsız olduğu veya ağ istekleri gibi harici kaynakların beklenmesini gerektiren durumlarda, uygulama verimliliğinde ve performansında önemli artışlara yol açabilir.
Blokaj yapmayan yapı: Eşzamansız programlama, G/Ç işlemleri gibi uzun süren görevleri beklemediği için programın geri kalanını engellemez. Kullanıcı arayüzü programlamasında bu, kullanıcı deneyimini ve yanıt verme hızını iyileştirebilir.
Asenkron programlamanın kullanılması gereken kullanım durumları
G/Ç'ye bağlı görevler genellikle eşzamansız olarak programlanır. Eşzamansız görevler, web geliştirmede API istekleri göndermek, veritabanlarına erişmek ve ana iş parçacığını kesintiye uğratmadan kullanıcı girdilerini işlemek için kullanılabilir.
Örnek: Web geliştirmede sözde kodla AJAX istekleri
Web geliştirmede AJAX istekleri göndermek için eşzamansız programlama kullanılabilir. Aşağıdaki örneğe bakın:
function fetchAndDisplayData(url) {
// This is a non-blocking operation
data = asyncFetch(url);
data.then((response) => {
// This code will run once the data has been fetched
displayData(response);
});
}Yukarıdaki sözde kodda, fonksiyon asyncFetch(url) Bu asenkron bir işlemdir. Fonksiyon displayData(yanıt) Değin asyncFetch(url) İşlem veri alımını tamamlamadı, yürütülmüyor. Bu arada, diğer kodlar arka planda çalışmaya devam edebilir ve bu da eşzamansız programlamanın engelleyici olmayan yapısını gösterir.
Asenkron ve senkron programlamanın karşılaştırılması
Eşzamanlı ve eşzamansız programlama arasındaki performans, program yürütme ve çalışma zamanı açısından farklar şunlardır:
Program yürütme
Aynı anda: Eşzamanlı bir sistemde, görevler sırayla, birbiri ardına yürütülür. Sonuç olarak, kontrol akışının tahmin edilmesi ve uygulanması kolaydır.
Asenkron: Eşzamansız bir ortamda görevler eş zamanlı olarak yürütülebilir. Bu, yazılımın bir sonraki göreve geçmeden önce bir görevin tamamlanmasını beklemesine gerek olmadığı anlamına gelir.
Performans
Aynı anda: Eş zamanlı yürütmede, bir görevin tamamlanması çok uzun sürerse, tüm sistem donabilir veya yanıt vermeyebilir.
Asenkron: Asenkron programlamanın engelleyici olmayan yapısı, özellikle kullanıcı arayüzü geliştirme bağlamında daha duyarlı ve sorunsuz bir kullanıcı deneyimine yol açabilir.
Programların vesilesi
Aynı anda: Adımların önceden belirlenmiş bir sırayla gerçekleştirilmesinin gerektiği durumlar için idealdir.
Asenkron: Görevler CPU'ya bağımlı olmaktan ziyade G/Ç'ye bağımlı olduğunda eşzamansız olarak kabul edilir.
Eşzamansız programlama ne zaman kullanılır?
- Web tabanlı uygulamalar: Ana iş parçacığının kesintiye uğramasını önlemek için, API istekleri yapmak gibi işlemleri gerçekleştirmek amacıyla asenkron görevler kullanılabilir.
- Veritabanı Yönetimi: Veri okuma ve yazma işlemleri zaman alıcı olabilir ve diğer görevler gerçekleştirilmeden önce tamamlanması gerekmez.
- Kullanıcı arayüzü programlama: Eşzamansız programlama, kullanıcı girdisini işlerken daha duyarlı ve akıcı bir kullanıcı deneyimi sağlar.
- Dosya G/Ç işlemleri: Genellikle, zaman alıcı dosya G/Ç işlemlerinin bir sonraki adıma geçmeden önce tamamlanması gerekmez.
Olay döngüsü ve çağrı yığını
JavaScript'te eşzamansız kodla etkili bir şekilde çalışmak, olay döngüsünü ve çağrı yığınını anlamayı gerektirir. Basitçe söylemek gerekirse, çağrı yığınının kodu sırayla yürüttüğü yer burasıdır. Eşzamanlı görevler önce yürütülür ve olay döngüsünün son olarak aşağıdaki gibi eşzamansız kod ifadelerini yürütmesine izin verilir: setTimeout Veya kodu eş zamanlı olarak işledikten sonra API isteklerini işleyin.
JavaScript, teknik olarak tek iş parçacıklı olmasına rağmen aynı anda birçok işlem yapıyormuş gibi görünüyor. Bu eşzamansız işlemler çalışırken, olay döngüsü ana iş parçacığını engellemeden tüm verilerin zamanında işlenmesini sağlar.
Olay döngüsünün ve çağrı yığınının nasıl etkileşim kurduğunu anlamak, daha iyi asenkron kod yazmamıza ve kullanıcı arayüzünün donması veya aşırı yavaş etkileşimler gibi yaygın sorunlardan kaçınmamıza yardımcı olur.
Web Çalışanlarını Kullanarak Eşzamansız Programlama
Görevleri eşzamansız olarak yönetmek için çok yararlı olan bir sonraki araç ise Web Çalışanları Ana iş parçacığını engellemeden arka planda JavaScript çalıştırmamıza olanak tanırlar; bu da performans ve karmaşık hesaplamalar veya büyük miktarda veri alma gibi yapmamız gereken görevler için oldukça faydalıdır. Web Worker'lar bize gerçek eşzamanlılık sağlar, yani yoğun işleri başka bir iş parçacığına aktarabilir ve ana iş parçacığının kontrolünü sağlayabiliriz. Ancak, akılda tutulması gereken bir nokta, Worker'ların DOM'a erişiminin olmaması ve bu nedenle doğrudan kullanıcı arayüzü güncellemeleri gerektirmeyen görevler için daha uygun olmalarıdır.
İşte Web Workers'ın nasıl kullanılacağına dair kısa bir örnek:
// In the main script
const worker = new Worker("./worker.js");
worker.postMessage("Start the task");
// In the worker script (worker.js)
onmessage = function (event) {
// Perform long-running task here
postMessage("Task done");
};Eşzamanlı programlama ne zaman kullanılır?
- Verileri sırayla al ve işle: Bazı uygulamalar için, bir veritabanından veri almak, o verinin işlenebilmesi için ön koşuldur.
- Temel senaryoların yazımı: Küçük betiklerle çalışırken eş zamanlı programlamayı anlamak ve hata ayıklamak daha kolay olabilir.
- CPU'ya bağımlı görevler: CPU'ya bağımlı ağır işlemlerin gerçekleştirilmesi. Eşzamanlı programlama, G/Ç'ye bağımlı görevler yerine CPU'ya bağımlı görevler için daha verimli olabilir.
Kodda pratik örnekler
Eşzamanlı kod örneği: Bir görev listesinin sırayla işlenmesi
Eşzamanlı programlamada görevler sıralı olarak işlenir. İşte Python'da bir örnek:
import time
def process_userData(task):
# Simulate task processing time
time.sleep(1)
print(f"Task {task} processed")
tasks = ['task1', 'task2', 'task3']
for task in tasks:
process_userData(task)Bu eşzamanlı yöntemle görevler sıralı olarak yürütülür. process_userData İşlenir. Bir görevin tamamlanması uzun sürerse, bu sıralı işlem nedeniyle sonraki görevler beklemek zorunda kalır ve bu da gecikmelere neden olabilir. Bu sorun, uygulama performansını ve kullanıcı deneyimini olumsuz etkileyebilir.
Eşzamanlı Olmayan Kod Örneği: Birden Fazla Kaynaktan Eşzamanlı Olarak Veri Alma
Buna karşılık, eşzamansız programlama görevlerin eş zamanlı olarak işlenmesine olanak tanır. İşte Python'da bu kütüphaneyi kullanan bir örnek. asyncio Verilmiştir:
import asyncio
async def retrieve_data(source):
# Simulate time taken to fetch data
await asyncio.sleep(1)
print(f"Data retrieved {source}")
sources = ['source1', 'source2', 'source3']
async def main():
tasks = retrieve_data(source) for source in sources]
await asyncio.gather(*tasks)
asyncio.run(main())Eşzamansız yöntem, birden fazla işlemi aynı anda başlatır. Bu, uygulamanın bir görevden diğerine kesintisiz olarak geçebilmesini sağlar. Bu sayede uygulama performansını ve kullanıcı deneyimini iyileştirebiliriz. Ancak, görevleri ve geri aramaları yönetmek uygulamayı zorlaştırabilir.
console.log("Start"); // First task (synchronous) - goes to call stack
setTimeout(() => {
console.log("Timeout callback"); // This task(aysnchronous) is put into the event loop
}, 1000);
console.log("End"); // Second task (synchronous) - in call stackÇağrı Yığını:
İşlev konsol.log('Başlat') Eşzamanlı bir işlem olduğu için önce çalıştırılır. Fonksiyon işlenir ve hemen çağrı yığınından kaldırılır.
İşlev setTimeout() Bu asenkron bir fonksiyondur, bu nedenle geri araması şu şekildedir: console.log('Zaman aşımı geri araması') Geciktirilir ve 1 saniye (1000 milisaniye) sonra yürütülmek üzere olay döngüsüne gönderilir, ancak kendisi setTimeout() Kod yürütülmesini engellemez.
Daha sonra konsol.log('Son') Ana iş parçacığında gerçekleşen eş zamanlı bir işlem olduğu için yürütülür.
Olay Döngüsü:
Eşzamanlı görevlerden sonra (örneğin konsol.log('Başlat') Ve konsol.log('Son')) yürütülür, olay döngüsü 1 saniyelik bir gecikme bekler ve ardından verilen asenkron geri arama setTimeout İşlemler.
Geri arama hazır olduğunda, olay döngüsü onu çağrı yığınına iter ve ardından yürütülür. ''Zaman aşımı geri araması'' Baskılar.
Çıktı:
Start
End
Timeout callbackBu örnek, JavaScript'in önce senkron görevleri nasıl yürüttüğünü, ardından ana çağrı yığını temizlendikten sonra olay döngüsünü kullanarak asenkron görevleri nasıl işlediğini gösterir.
Her programlama modelini etkili bir şekilde kullanmak için en iyi uygulamalar ve kalıplar
Eşzamanlı programlama
- Basitliğin önemli olduğu durumlarda kullanın: Eşzamanlı programlama basit ve anlaşılır olduğundan basit görevler ve betikler için idealdir.
- G/Ç'ye bağlı görevlerde bundan kaçının: Eşzamanlı programlama, G/Ç işlemlerini (ağ istekleri veya disk okuma/yazma gibi) beklerken yürütülmekte olan iş parçacığını engelleyebilir. Engellemeyi önlemek için bu tür görevler için eşzamansız programlama kullanın.
Eşzamansız programlama
- G/Ç'ye bağlı görevler için kullanın: Eşzamansız programlama, G/Ç'ye bağlı görevlerle uğraşırken mükemmel bir şekilde çalışır. Yürütülen iş parçacığının, G/Ç işleminin tamamlanmasını beklerken diğer görevleri gerçekleştirmeye devam etmesini sağlar.
- Ortak kaynaklara dikkat edin: Birden fazla görevin paylaşılan kaynaklara erişmesi ve bunları değiştirmesi durumunda, eşzamansız programlama yarış koşullarına yol açabilir. Bu sorunu önlemek için kilitler veya semaforlar gibi senkronizasyon mekanizmaları kullanın.
Ortak tasarım kalıpları
Eşzamanlı programlama
Eşzamanlı programlamada en sık karşılaşılan desen, görevlerin birbiri ardına yürütüldüğü sıralı yürütme desenidir.
Eşzamansız programlama
- Sözler: Sözler, henüz mevcut olmayabilecek bir değeri temsil eder. Eşzamansız işlemleri yönetmek ve değer mevcut olduğunda veya bir hata oluştuğunda çağrılan geri aramaları eklemek için yöntemler sağlamak amacıyla kullanılırlar.
- Asenkron/Bekleme: Bu özellik, asenkron kodun senkron koda benzemesini sağlayan, vaatlerin üzerine eklenen bir tür sözdizimsel şekerlemedir. Bu, asenkron kodun yazılmasını ve anlaşılmasını kolaylaştırır.
Yaygın sorunlardan nasıl kaçınılır?
Geri Arama Cehennemi
«"Geri arama cehennemi", kodu okunamaz ve anlaşılmaz hale getiren çağrıların iç içe geçmesi anlamına gelir. İşte bundan kaçınmanın bazı yolları:
- Kodunuzu modüler hale getirin: Kodunuzu daha küçük, yeniden kullanılabilir fonksiyonlara bölün.
- Promises veya Async/Await Kullanımı: Bu JavaScript özellikleri kodunuzu temizleyebilir ve daha okunabilir ve anlaşılır hale getirebilir.
- Hata işleme: Geri aramalarınızda hata yönetimini her zaman göz önünde bulundurun. İşlenmeyen hatalar öngörülemeyen sonuçlara yol açabilir.
Asenkron Programlama – Bellek Yönetimi
Asenkron programlama ile çalışırken belleği etkili bir şekilde nasıl yönetebileceğinize dair birkaç ipucu paylaşmak istiyorum, çünkü yanlış kullanım bellek sızıntıları gibi performans sorunlarına yol açabilir.
Asenkron programlamada bellek yönetimi
Eşzamansız kodla çalışırken, belleğin nasıl ayrıldığına ve nasıl temizlendiğine dikkat etmek çok önemlidir. Bu, uzun süredir devam eden ve çözümlenmemiş görevler veya taahhütler için geçerlidir ve düzgün yönetilmezse bellek sızıntılarına yol açabilir.
Çöp Toplama
JavaScript'te bellek, çöp toplayıcı tarafından yönetilir. Çöp toplayıcı, program tarafından artık kullanılmayan belleği otomatik olarak temizler. Ancak eşzamansız programlama kullanırken, dikkatli olmazsak, gerekenden daha fazla bellek kalabilir. Örneğin, asla çözülmeyen sözler, hâlâ bağlı olan olay dinleyicileri veya çalışan zamanlayıcılar daha büyük bellek parçaları barındırabilir.
Asenkron kodda bellek sızıntılarının yaygın nedenleri
- Çözülmemiş vaatler: Bir söz asla yerine getirilmez veya reddedilmezse, hafızanın temizlenmesi engellenebilir.
let pendingPromise = new Promise(function (resolve, reject) {
// This promise never resolves
});- Olay Dinleyicileri: Artık ihtiyaç duyulmayan bir olay dinleyicisini kaldırmayı unutmak kolaydır. Bu, gereksiz bellek tüketimine neden olur.
element.addEventListener("click", handleClick);
// Forgetting to remove the listener
// element.removeEventListener('click', handleClick);- Zamanlayıcılar: Kullanımı
setTimeoutVeyasetIntervalArtık ihtiyaç duyulmadığında bunları temizlememek, belleğin gereğinden uzun süre tutulmasına neden olabilir.
var timer = setInterval(function () {
console.log("Running.");
}, 1000);
// Forgetting to clear the interval
// clearInterval(timer);Bellek sızıntılarını önlemek için en iyi uygulamalar
- Sözler, çözümler veya reddeder: Bir vaadin artık ihtiyaç duyulmadığında hafızasının serbest bırakılmasını sağlamak için, vaadin çözülmesi veya reddedilmesi gerekir.
let myPromise = new Promise((resolve, reject) =>
setTimeout(() => {
resolve("Task complete");
}, 1000),
);
myPromise.then((result) => console.log(result));- Olay Dinleyicilerini Kaldırma: Olay dinleyicileri eklendikten sonra, artık ihtiyaç duyulmadığında, ilgili öğe kaldırıldığı veya işlevselliği artık gerekli olmadığı için bunları kaldırın.
element.addEventListener("click", handleClick);
// Proper cleanup when no longer needed
element.removeEventListener("click", handleClick);- Zamanlayıcıları Temizle: Eğer ki
setTimeoutVeyasetIntervalBunları kullanıyorsanız, gereksiz bellek işgalini önlemek için işiniz bittiğinde temizlemeyi unutmayın.
var interval = setInterval(function () {
console.log('Doing something...');
}, 1000);
// Clear the interval when done
clearInterval(interval);Zayıf Referanslar
Bir diğer gelişmiş teknik ise, ZayıfHarita Veya Zayıf Küme Kodunuzda artık referans alınmadığında çöp toplayıcı tarafından otomatik olarak temizlenebilecek nesneleri yönetmek için kullanılır. Bu yapılar, çöp toplayıcı tarafından temizlenmelerini engellemeden nesnelere referans vermenizi sağlar.
let myWeakMap = new WeakMap();
let obj = {};
myWeakMap.set(obj, "someValue");
// If obj gets dereferenced somewhere else, it will be garbage-collected.
obj = null;Sonuç
Eşzamanlı ve eşzamansız programlama modelleri hakkındaki tartışmamızı tamamladığımızda, her birinin belirli durumlar için uygun hale getiren kendine özgü avantajları olduğu açıktır. Eşzamanlı programlama sıralı ve bloke olmayan bir şekilde çalıştığı için anlaşılması kolaydır ve doğrusal olarak gerçekleştirilmesi gereken görevler için idealdir.
Öte yandan, engellemeyen yapısı ve birden fazla görevi aynı anda yürütme becerisiyle bilinen eşzamansız programlama, özellikle G/Ç'ye bağlı işlemlerde, yanıt verme hızı ve performansın gerekli olduğu durumlarda en iyi sonucu verir. Her iki yaklaşımın kullanımı da uygulamanın ihtiyaçlarını, performans sorunlarını ve istediğiniz kullanıcı deneyimini anlamanıza bağlıdır.










