GoProgramlamaGo Geliştirici

Neden Go'nun select ifadesi birden fazla Kanal aynı anda hazır olduğunda uniform sahte rastgele seçim kullanıyor?

Hintsage yapay zeka asistanı ile mülakatları geçin

Sorunun Cevabı

Go'nun select ifadesi, iletişim işlemleri arasında adaleti sağlamak ve açlığı önlemek için uniform sahte rastgele seçim uygulamaktadır. Select'te birden fazla durum aynı anda hazır olduğunda, çalışma zamanı durum sırasının rastgele bir permütasyonunu oluşturur ve bunları birinin başarılı olduğu ana kadar sıralı olarak değerlendirir. Bu tasarım, herhangi bir Kanal sürekli olarak hazırsa, yürütmeye sürekli olarak hâkim olmasını engelleyerek seçim olasılığını tüm hazır durumlar arasında eşit şekilde dağıtır.

Hayattan Bir Durum

Bir ana Goroutine'un, üç bağımsız borsa beslemesinden piyasa verilerini topladığı yüksek frekanslı bir ticaret platformunu düşünün. Bu beslemeler, farklı Kanallar aracılığıyla güncellemeler sağlar: NYSE, NASDAQ ve Forex. Forex kanalı mikro saniye ölçeğinde döviz dalgalanmalarını iletirken, NYSE her on milisaniyede bir güncelleme yapar ve NASDAQ normal koşullar altında her elli milisaniyede bir büyük blok ticaret bildirimleri gönderir.

Eğer Go select durumlarını sabit söz dizim sırasına göre değerlendirirse, Forex kanalının sürekli hazır olması, dalgalı ticaret dönemlerinde NASDAQ bildirimlerini felaket bir şekilde aç bırakır. Bu açlık, toplama motorunun kritik ticaret işlemlerini kaçırmasına neden olur ve potansiyel olarak en iyi yürütme raporlama gereksinimlerini ihlal edebilir. Sistem, her veri kaynağının işleme süresi almasını garanti eden bir adalet mekanizması gerektiriyordu.

Başlangıçta, uygulama kodumuzda kanallar arasında dönen bir indeks tutarak manuel bir dairesel işlem uygulamayı düşündük. Bu yaklaşım, hangi kanalın en son hizmet aldığını izleyerek belirleyici bir adalet sağlar. Ancak bu çözüm, eşzamanlı erişim arasında paylaşılan durumu yönetmemizi gerektirdiği ve beklemek için çoklu Kanallar ile temiz bir sözdizimi ile beklemenin basit niyetini kararttığı için önemli karmaşıklıklar getirdi.

İkinci yaklaşım, yüksek frekanslı Forex güncellemelerini yapay olarak yavaşlatan bir ağırlık öncelik sistemi uygulamaktı. Bu, yavaş kanallar için bant genişliği yaratırken mesaj akışını ince ayar yapmamıza olanak tanıdı. Ancak bu, pazardaki dalgalanma koşullarına dayanarak sürekli olarak throttle oranlarının kalibrasyonunu gerektirdi. Bakım yükü aşırı hale geldi çünkü yanlış yapılandırma, kritik fiyat hareketlerini sessizce kaybetmeyi sağlayabiliyordu.

Sonunda, Go'nun yerleşik sahte rastgele select davranışına güvendik. Bu, uygulama katmanı karmaşıklığı olmadan istatistiksel bir adalet sağladı. Uniform dağılım, milyonlarca yineleme üzerinde her Kanal'ın kaynak kodundaki konumuna değil, gerçek hazır olma sıklığına orantılı yürütme fırsatlarını almasını sağladı. Bu seçim, açlık olaylarını tamamen ortadan kaldırdı ve deterministik düzenin daha önce gizli tuttuğu potansiyel yarış koşullarını ortaya çıkaran belirsiz doğası, stres testleri sırasında yardımı dokundu.

Adayların Sıklıkla Kaçırdığı Noktalar

Go neden select durumları için belirli bir değerlendirme sırasını garanti etmiyor?

Go, hazır Kanallar arasında seçim yapmanın deterministik olmadığını belirterek, geliştiricilerin uygulama özel sıralama gerektiren kodlar yazmalarını önlemek için böyle bir tasarım geliştirmiştir. Çalışma zamanı, versiyonlar arasında rastgelelik algoritmasını değiştirebilir, bu nedenle programlar tüm durumları kaynak pozisyonlarına bakılmaksızın eşit olasılıklı olarak değerlendirmelidir. Bu tasarım felsefesi, Goroutines'ın zamanlama varsayımlarına veya derleyici güncellemeleri sırasında bozulabilecek kanal önceliğine dayanmadığı sağlam eşzamanlılık kalıplarını zorlamaktadır.

Select'ı dil ilkelere kullanarak bir Kanalı diğerine öncelik vermek için zorlayabilir misiniz?

Go'nun select'ı doğası gereği adil olsa da, geliştiriciler select ifadelerini iç içe yerleştirerek veya yardımcı kontrol Kanalları kullanarak öncelik simüle edebilirler; ancak bu, geleneksel Go stilini ihlal eder. Bir anti-deseni, hızlı Kanalları zaman aşımı mantığı ile sarmak veya meşgul döngülerde varsayılan durumları kullanmaktır; bu, meşgul bekleme oluşturur ve CPU döngülerini boşa harcar. Doğru yaklaşım, uniform rastgeleliği dilin bir özelliği olarak kabul etmek ve mimariyi, eşit şekilde bekleyen Kanallar arasında sıkı bir öncelik gerektirmeyecek şekilde yeniden tasarlamaktır.

Hangi senkronizasyon mekanizması, select'in birden fazla Kanala atomik olarak beklemesine olanak tanır?

Select, Goroutine'u tüm ilgili Kanallar'ın bekleme kuyruklarına aynı anda kaydederek uyku moduna geçer, böylece bekleme durumunun tutarlı bir görüntüsünü oluşturur. Herhangi bir Kanal hazır olduğunda, Goroutine'u uyandırır; ardından işlemle devam etmek için kilit için rekabet etmesi gerekir. Bu atomik çoklu kayıt, kaybolan uyanmaları önler ve birden fazla Kanallar aynı anda veri aldığında bile yalnızca bir durumun yürütülmesini sağlar; ancak adaylar sıklıkla select'in yoklama yaptığını veya merkezi bir aracıyı kullandığını yanlış anlarlar.