Goroutinlerin ve kanalların Go programlarınızda verimli eşzamanlılığı nasıl sağladığını öğrenin.
Eşzamanlılık, programların aynı anda birden fazla görevi verimli bir şekilde yerine getirmesini sağladığından, modern yazılım geliştirmenin çok önemli bir yönüdür. Geliştirilmiş performans, yanıt verme ve kaynak kullanımına yol açan çeşitli işlemleri yürüten programlar yazabilirsiniz.
Eşzamanlılık, Go'nun hızla benimsenmesinden sorumlu özelliklerden biridir. Go'nun yerleşik eşzamanlı programlama desteği, yarış koşulları ve kilitlenmeler gibi yaygın tuzaklardan kaçınmaya yardımcı olurken basit olarak kabul edilir.
Go'da eşzamanlılık
Go, tümü standart kitaplığında ve araç zincirinde bulunan çeşitli mekanizmalar aracılığıyla eşzamanlılık için güçlü destek sağlar. Git programları goroutines ve kanallar aracılığıyla eşzamanlılık elde edin.
Goryordamlar hafiftir, aynı adres alanı içinde diğer goyordamlarla aynı anda çalışan bağımsız olarak yürüten işlevlerdir. Goroutinler, birden fazla görevin açık iş parçacığı yönetimi olmadan aynı anda ilerlemesine izin verir. Goroutinler, işletim sistemi iş parçacıklarından daha hafiftir ve Go, aynı anda binlerce hatta milyonlarca goroutine'i verimli bir şekilde çalıştırabilir.
Kanallar, gorutinler arasında koordinasyon ve veri paylaşımı için iletişim mekanizmasıdır. Kanal, gorutinlerin değer gönderip almasına izin veren yazılı bir kanaldır. Kanallar, yarış koşullarını ve diğer ortak eşzamanlılık sorunlarını önlerken, programlar arasında güvenli veri paylaşımını sağlamak için senkronizasyon sağlar.
Goroutinleri ve kanalları birleştirerek Go, güvenlik ve verimliliği korurken eşzamanlı programların geliştirilmesini basitleştiren güçlü ve anlaşılır bir eşzamanlılık modeli sağlar. Bu mekanizmalar, kolayca kullanmanızı sağlar. çok çekirdekli işlemciler ve yüksek düzeyde ölçeklenebilir ve duyarlı uygulamalar oluşturun.
Eşzamanlı Kod Yürütme için Goroutinler Nasıl Kullanılır
Go çalışma zamanı, rutinleri yönetir. Goroutinlerin kendi yığınları vardır ve bu, birkaç kilobaytlık ilk yığın boyutuyla hafif bir ayak izine sahip olmalarına olanak tanır.
Goroutinler, Go çalışma zamanı tarafından birkaç işletim sistemi iş parçacığına çoğullanır. Go çalışma zamanı planlayıcısı, iş yükünü verimli bir şekilde dağıtarak bunları mevcut iş parçacıklarına planlar ve daha az işletim sistemi iş parçacığında birden çok gorutinin eşzamanlı yürütülmesine izin verir.
Goroutinler oluşturmak basittir. Şunu kullanacaksınız: Gitmek goroutines bildirmek için bir işlev çağrısı tarafından takip edilen anahtar kelime.
işlevana() {
Gitmek işlev1() // function1 için goroutine oluştur ve çalıştır
Gitmek işlev2() // function2 için goroutine oluştur ve çalıştır// ...
}işlevfonksiyon1() {
// fonksiyon1 için kod
}
işlevişlev2() {
// fonksiyon2 için kod
}
Program çağrıldığında işlev1() Ve işlev2() ile Gitmek anahtar kelime, Go çalışma zamanı işlevleri eş zamanlı olarak gorutinler olarak yürütür.
İşte konsola metin yazdıran bir gorotinin örnek bir kullanımı:
paket ana
içe aktarmak (
"fmt"
"zaman"
)işlevMetin yazdır() {
için ben := 1; ben <= 5; ben++ {
fmt. Yazdır("Yazdırma metni", Ben)
zaman. Uyumak(1 * zaman. Saniye)
}
}işlevana() {
Gitmek Metin yazdır() // printText işlevini eşzamanlı olarak yürütmek için bir goroutine başlatın// Ana programdaki diğer görevleri gerçekleştirin
için ben := 1; ben <= 5; ben++ {
fmt. Yazdır("Diğer görevleri yerine getirme", Ben)
zaman. Uyumak(500 * zaman. Milisaniye)
}
// Goroutinin bitmesini bekleyin
zaman. Uyumak(6 * zaman. Saniye)
}
bu Metin yazdır işlevi art arda bazı metinleri konsola yazdırır. için ile her ifade arasındaki bir saniyelik gecikmeyi takiben beş kez çalışan döngü zaman paketi.
bu ana işlevi çağırarak bir gorutin başlatır Yazdır Metni'ne gitbaşlatan Metin yazdır işlevin, işlevin programdaki kodun geri kalanıyla eşzamanlı olarak yürütülmesine izin veren ayrı bir eşzamanlı gorutin olarak işlev görür. ana işlev.
Son olarak, programın programdan önce çıkmamasını sağlamak için Metin yazdır goroutine biter, zaman. Uyumak işlevi, ana gorutini altı saniye süreyle duraklatır. Gerçek dünya senaryolarında, gorutinlerin yürütülmesini koordine etmek için kanallar veya bekleme grupları gibi senkronizasyon mekanizmalarını kullanırsınız.
İletişim ve Senkronizasyon için Kanalları Kullanma
Goroutinler, kanallar aracılığıyla iletişim ve senkronizasyon için yerleşik desteğe sahiptir, bu da yazmayı eşzamanlı hale getirir genellikle kilitler gibi manuel senkronizasyon mekanizmaları gerektiren geleneksel iş parçacıklarından daha kolay kodlayın ve semaforlar.
Kanalları, rutinler arasındaki veri akışı için boru hatları olarak düşünebilirsiniz. Bir goroutine kanala bir değer gönderebilir ve başka bir goroutine bu değeri kanaldan alabilir. Bu mekanizma, veri alışverişinin güvenli ve senkronize olmasını sağlar.
Şunu kullanacaksınız: kanallar aracılığıyla veri göndermek ve almak için operatör.
İşte iki goroutin arasındaki iletişim için kanalların temel kullanımını gösteren bir örnek:
işlevana() {
// string türünde ara belleğe alınmamış bir kanal oluştur
ç := yapmak(chansicim)// Goroutine 1: Kanala bir mesaj gönderir
Gitmekişlev() {
ç "Merhaba, Kanal!"
}()
// Goroutine 2: Mesajı kanaldan alır
mesaj := fmt. Yazdır (msj) // Çıktı: Merhaba Kanal!
}
kanaldaki ana işlev, adlı arabelleğe alınmamış bir kanaldır. ch ile oluşturulan yapmak() işlev. İlk goroutine "Merhaba Kanal!" mesajını gönderir. kullanarak kanala operatör ve ikinci gorotin, aynı operatörü kullanan kanaldan mesajı alır. Son olarak, ana fonksiyon alınan mesajı konsola yazdırır.
Yazılan kanalları tanımlayabilirsiniz. Kanal türünü oluştururken belirteceksiniz. Aşağıda, farklı kanal türlerinin kullanımını gösteren bir örnek verilmiştir:
işlevana() {
// Tamponlanmamış kanal
kanal1 := yapmak(chanint)// 3 kapasiteli tamponlu kanal
kanal2 := yapmak(chansicim, 3)// Kanallardan değer gönderme ve alma
kanal1 42// ch1'e bir değer gönder
değer1 := // ch1'den bir değer al
kanal2 "Merhaba"// ch2'ye bir değer gönder
değer2 := // ch2'den bir değer al
}
bu ana işlev iki kanal oluşturur: ch1 arabelleğe alınmamış bir tamsayı kanalıyken, ch2 3 kapasiteli arabelleğe alınmış bir dizi kanalıdır. kullanarak bu kanallara değer gönderip alabilirsiniz. operatör (değerler belirtilen tipte olmalıdır).
Kanal işlemlerinin engelleme doğasından yararlanarak, rutin yürütmeyi koordine etmek için kanalları senkronizasyon mekanizmaları olarak kullanabilirsiniz.
işlevana() {
ç := yapmak(chanbool)Gitmekişlev() {
fmt. Yazdır("Grutin 1")
ç doğru// Sinyal tamamlama
}()Gitmekişlev() {
// Goroutine 1'den tamamlama sinyalini bekleyin
fmt. Yazdır("Gortin 2")
}()
// Goroutine 2'den gelen tamamlama sinyalini bekleyin
fmt. Yazdır("Ana gorutin")
}
bu ch kanal booledir. İki gorutin aynı anda çalışır ana işlev. Goroutine 1, bir sinyal göndererek tamamlandığını bildirir. doğru kanala değer ch. Goroutine 2, kanaldan bir değer alarak tamamlanma sinyalini bekler. Son olarak, ana goyordam ikinci gorutinden tamamlama sinyalini bekler.
Gin ile Go'da Web Uygulamaları Oluşturabilirsiniz
Go'nun eşzamanlılık özelliklerinden yararlanırken Go with Gin'de yüksek performanslı web uygulamaları oluşturabilirsiniz.
HTTP yönlendirmesini ve ara katman yazılımını verimli bir şekilde işlemek için Gin'i kullanabilirsiniz. Veritabanı sorguları, API çağrıları veya diğer engelleme işlemleri gibi görevler için goyordamlar ve kanallar kullanarak Go'nun yerleşik eşzamanlılık desteğinden yararlanın.