İçeriğe geç
academia.sh

Kurs Orta

Eşzamanlılık

Bu kursun sonunda

Kursa başla

01

Goroutine ve Kanallar

Hafif bir eşzamanlı yürütme biriminin başlatılmasıyla durmasının ayrı iki iş olması, kanalın değer aktarırken aynı anda eşzamanlama sağlaması, tamponun engelleme davranışını nerede değiştirip nerede değiştirmediği, birden çok kanal üzerinde beklemenin dal seçimi, ve kapatmanın bir sonlanma sinyali olarak taşıdığı bilgi.

  1. 01 Goroutine On iki goroutine'in yalnız 2'si kendi durdu; 5'i başka bir goroutine'in yaptığı bir işi bekleyip geldiği için, 2'si bir bağlamın iptal edilmesiyle, 3'ü hiç durmadan: kursun bağlayıcı dağılımı bu derste üretiliyor. Bir goroutine başlatmak tek satırdır ve o satır ne zaman duracağını hiç söylemez — durma kararı çoğunlukla goroutine'in kendi gövdesinde değil, başka birinin yaptığı bir işte duruyor. Sınırlayıcı ölçüm: kendi durdu sınıfı da bir sözleşmedir, çünkü gövdesi biten bir goroutine bunu kimseye kendiliğinden bildirmiyor.
  2. 02 Kanallar Bir kanal aynı satırda iki iş birden yapar: bir değeri bir goroutine'den ötekine taşır ve iki goroutine'in aynı noktada buluşmasını zorlar. Tamponsuz bir kanala gönderim, karşı tarafta bir alıcı hazır olana kadar hiç tamamlanmaz; alıcı hiç yoksa deneme kalıcı olarak geçmez. Sınırlayıcı ölçüm: kanal bir kuyruk değildir, çünkü aktarılan değer kopyalanır ve gönderen tarafın gönderimden sonraki değişikliği alıcıya hiçbir zaman ulaşmaz.
  3. 03 Tamponlu ve Tamponsuz Kanallar Bir kanalın kapasitesi, engellemenin nerede başladığını değiştirir: kapasite dolana kadar gönderim hiç beklemeden geçer, dolduğunda tamponsuz kanaldaki gibi engeller. Üç kapasitede beş deneme gönderiminin kaçının engellenmeden geçtiği ölçülüyor. Sınırlayıcı ölçüm: tampon eşzamanlamayı kaldırmıyor, yalnız erteliyor — tamponlu bir kanala gönderim tamamlandığında gönderen, alıcının o değeri aldığını hâlâ bilmiyor.
  4. 04 select Deyimi Birden çok kanal üzerinde aynı anda beklemenin karşılığı select deyimidir: yalnız bir dal hazırsa o dal belirlenimci biçimde seçilir, hiçbiri hazır değilse ve bir default dalı varsa o dal seçilir. Yazım sırası bir öncelik taşımaz. Sınırlayıcı ölçüm: iki dal aynı anda hazırsa seçim rastgeledir ve bu durum koşturulmuyor, yalnızca modelleniyor — rastgelelik dilin kendi kararı.
  5. 05 Kanal Kapatma ve Aralık Bir kanalın kapatılması bir sonlanma sinyalidir: kapanan kanalda range biter, kapanan kanaldan doğrudan alım sıfır değer ve false döner. Dört alım biçiminin (açık, kapalı-dolu, kapalı-boş, tekrar kapalı-boş) yanıtı bunu ölçüyor. Kapatma sorumluluğu her zaman göndericidedir. Sınırlayıcı ölçüm: kapalı bir kanala gönderim de, bir kanalı ikinci kez kapatmak da panikler; ikisi de recover ile yakalanıp yalnız panik=true/false olarak yazılıyor.

02

Eşzamanlılık Kalıpları

Sabit sayıda işçiyle iş dağıtımının kuyruk ve sonuç kanallarına bağlanması, bir işin çoğa yayılıp sonuçların toplanması, aşamalı akış işlemede her aşamanın kendi kapatma sorumluluğu, bağlamın iptali ve istek kapsamlı değerleri taşıması, ve zaman aşımıyla son tarihlerin kaynak sızıntısını nerede önlediği.

  1. 01 İşçi Havuzları Sabit sayıda işçi, paylaşılan bir iş kanalından okur; kanal kapandığında hepsi aynı sebeple durur — beklediği geldi. Beş iş sekiz işçiye dağıtıldığında toplam alınan iş ve toplam rapor eden işçi sayısından, en az kaç işçinin hiç iş almadan durduğu çıkarılır. Sınırlayıcı ölçüm: işçi sayısını artırmak var olan işi bölmez, yalnız daha fazla işçinin boş kalmasına yol açar; kapatılmayan bir iş kanalında işçiler hiç durmaz.
  2. 02 Yayma ve Toplama Bir kaynak, sabit sayıda tüketiciye yayıldığında (yayma) sonuçlar tek bir toplama kanalında yeniden birleşiyor (toplama); toplayıcının durma sebebi, bir bekleme grubunun bütün üreticiler bitince toplama kanalını kapatmasına bağlı. Sınırlayıcı ölçüm: toplama kanalını kim kapatır sorusunun tek yanıtı vardır — hiçbir üretici tek başına güvenle kapatamaz (deneyen üç üreticiden ikisi paniklerken biri başarır) ve kapatılmazsa toplayıcı hiç durmaz.
  3. 03 Boru Hatları Aşamalı akış (boru hattı) düzeninde her aşama kendi çıktı kanalını kendisi açar ve kendisi kapatır; bir üretim, bir kare alma ve bir toplama aşamasından geçen beş değer, hiçbir aşamanın sırayı bozmadığı bir zincirde akıyor. Sınırlayıcı ölçüm: tüketici zincirin ortasından erken vazgeçtiğinde önündeki aşamalar hiç durmaz — kapatma sorumluluğu her aşamada doğru kurulsa bile, zincirin en ucundaki tüketici vazgeçtiğinde hiçbiri bunu bilmiyor. Çözüm sıradaki dersin konusu.
  4. 04 Bağlam Paketi Tek bir iptal, ctx.Done() üzerinde bekleyen dört goroutine'in dördüne de aynı anda ulaşıyor; hepsi 'iptal' sınıfında duruyor ve ctx.Err() aynı sabit sebebi taşıyor. İstek kapsamlı bir değer (context.WithValue) taşımanın ne için olduğu ve ne için olmadığı ayrı ayrı ölçülüyor. Sınırlayıcı ölçüm: bağlam kimseyi zorla durdurmuyor, yalnız haber veriyor — ctx.Done()'u hiç denetlemeyen bir goroutine, bağlam zaten iptal edilmiş olsa bile kendi işini sonuna kadar tamamlıyor.
  5. 05 Zaman Aşımı ve Son Tarihler Zaman aşımı bir select deyiminin bir dal seçimidir: sonuç önceden hazırsa sonuç dalı, bağlam önceden iptal edilmişse (zaman aşımını temsilen) iptal dalı seçiliyor — ikisi de belirlenimci, çünkü kurulumda yalnız bir dal gerçekten hazır. Süre hiçbir yerde ölçülmüyor, basılan tek şey hangi dalın seçildiği. Sınırlayıcı ölçüm: zaman aşımı bekleyen tarafı kurtarıyor ama beklenen işi durdurmuyor — dalından çıkan çağıranın arkasında, sonucunu artık kimsenin almayacağı bir iş goroutine'i sızıntı olarak kalıyor.

03

Paylaşılan Durum

Karşılıklı dışlamanın kilit kapsamıyla ölçülmesi, toplu beklemenin sayaç sözleşmesi, bir kez çalıştırma ve atomik işlemlerin kilide göre yeri, ve yarış koşulu saptayıcısının test sırasında ne bulup ne bulamadığı.

  1. 01 Dışlama Kilitleri Bir goroutine kilidi tutan başka bir goroutine kilidi bırakana kadar bloklanıyor ve durma sınıfı beklediği geldi oluyor. Aynı sayaç kilitli ve kilitsiz iki kurulumla 20 goroutine ve goroutine başına 100 artışla işletiliyor, ikisi de 2000 veriyor — çünkü kilitsiz kurulum gerçek bir yarış kurmuyor, her goroutine kendi gözesine yazıyor. Sınırlayıcı ölçüm, kilit kapsamı dışına taşan tek bir yazmayı kanalla zorlanmış bir sırayla modelliyor: iki artış uygulanıyor ama sonuç 101 yerine 1 çıkıyor.
  2. 02 Bekleme Grupları Beş işçinin tamamlanmasını bir sayaç bekliyor: Add başlamadan önce sayacı beşe çıkarıyor, her işçi kendi Done'unu defer ile garanti ediyor, Wait sayaç sıfıra inince dönüyor — durma sınıfı yine beklediği geldi. Sayaç hiç sıfırlanmazsa Wait hiçbir zaman dönmüyor ve bu sızıntı bir boolean'la ölçülüyor; Done bir kez fazladan çağrıldığında sayaç eksiye düşüyor ve bekleme grubu panikliyor, panik recover ile yakalanıp yalnız panik=true yazılıyor. Sınırlayıcı ölçüm: beş işçinin hangisinin önce bittiği hiç ölçülmüyor, yalnız hepsinin bittiği ölçülüyor — sonuçlar toplanıp sıralanarak basılıyor.
  3. 03 Eşzamanlılık İlkelleri Otuz goroutine aynı ilklendirmeyi çağırıyor ama bir kez çalıştırma sözleşmesi gövdenin tam olarak bir kez koşmasını garanti ediyor. Otuz goroutine, her biri beş yüz artışla, aynı sayacı bir kez atomik işlemlerle bir kez kilitle artırıyor; ikisi de 15000 veriyor. Sınırlayıcı ölçüm, iki ayrı atomik değişkenin (bakiye ve işlem sayısı) her biri kendi başına tutarlı kalırken bir arada okunduklarında tutarsız bir çift verebileceğini kanalla zorlanmış bir sırayla modelliyor: okuyan taraf bakiye=100, işlemSayısı=0 görüyor.
  4. 04 Yarış Koşulu Saptayıcı Saptayıcı dilin kendi dağıtımının parçası ve program içinden çağrılıyor: kurgulanmış bir kaynak geçici bir dizine yazılıp saptayıcı seçeneğiyle koşturuluyor, yalnız çıkış kodu okunuyor. Üç kurulumdan korumasız paylaşım buluyor, kilitli paylaşım ve kanal üzerinden aktarım bulamıyor. Sınırlayıcı ölçüm — kursun son ve en önemli sınırı — aynı korumasız kod hiç koşmayan bir dalın içine konduğunda saptayıcının onu da bulamadığını gösteriyor: saptayıcı yalnız koşan yolu görür.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat