Go programlama dilinin en popüler yönlerinden biri, bir bilgisayarın aynı anda birçok görevi yerine getirme kapasitesi için birinci sınıf desteğidir. Bilgisayarlar tek bir kod akışını daha hızlı yürütmekten aynı anda birçok akışı çalıştırmaya geçtikçe, aynı anda kod çalıştırma yeteneği programlamada daha önemli hale geliyor. Daha hızlı çalışan programları yapmak için , programcılar bunları aynı anda çalışacak şekilde tasarlamalıdır, böylece sistemin her bir eşzamanlı öğesi diğerlerinden bağımsız olarak çalışabilir.
İki Go işlevi, Goroutines ve kanallar birlikte kullanıldığında eşzamanlılığı kolaylaştırır. Goroutines, bu yetenek için temel ilkel türü sunar. Goroutines bellek alanı, iş parçacıkları arası etkileşim ve ağ bağlantısı açısından daha ucuzdur. Ayrıca, birçok programlama dilinin desteklediği iş parçacıklarına göre daha iyi bir başlangıç süresine sahiptirler. Özünde Go, Goroutines Java ve diğer programlama dillerinin thread olarak adlandırdığı şey olarak atıfta bulunur.
Goroutines nedir?
Goroutine, Golang'da programın geri kalanıyla aynı anda çalışan basit bir uygulama dizisidir. Bir goroutin oluşturma maliyeti son derece düşük olduğundan, standart ipliklere Goroutines ekonomiktir. Bu nedenle, eşzamanlı programlama için Go yaygın olarak kullanılırlar. Her program, ana goroutin olarak bilinen en az tek bir goroutinden oluşur. Ana goroutin, diğer tüm goroutinleri kontrol eder; bu nedenle, ana goroutin sona ererse, komut dosyasındaki diğer tüm goroutinler de sona erer. Goroutine arka planda her zaman etkindir.
Örnek: İşte bir örnek: defterinize bir şeyler yazıyorsunuz ve acıkıyorsunuz; bir mola vereceksin ve yiyecek bir şeyler alacaksın. Sonra yeniden yazmaya başlayın. Şimdi eşzamanlı istihdam olarak kabul edilen bir zaman aralığına göre iki rol (yazma ve yemek yeme) yapıyorsunuz. Bu iki görevin (yazma ve yemek yeme) hala aynı anda tamamlanması gerektiği vurgulanmalıdır. Öğeler aynı anda tamamlandığında buna paralellik denir (cipsleri yerken cep telefonunuzu kullandığınızı düşünün). Eşzamanlılık, aynı anda birçok şeyle etkileşim kurmayı içerir. Paralellik (birçok şeyi aynı anda gerçekleştirmek) bunun bir alt sınıfıdır (aynı anda yapılması gerekmez) belirli bir zaman çizelgesiyle.
Fonksiyon çağrısına go anahtar sözcüğünü uygulayarak bir goroutine ekleyebiliriz. Go anahtar sözcüğünü işleyen çağrıya uyguladığımızda, eşzamanlılığı performansa ayarlayacağız. Ama önce, go anahtar sözcüğünü yürütmeye uygulamanın etkisini belirleyelim. Bir programda iki goroutin olduğunu düşünelim. " package main import " metni programın girişi olacaktır. Go, bir paket ana içe aktarma, bildirime dayalı bir içe aktarma ifadesidir. Ana goroutin ( first goroutine) ima edilir. go ( f) çalıştırdığımızda ikinci goroutin (0) oluşur. Genellikle, bir sonraki satıra geçmeden önce bir işlevi yürüttüğümüzde, yazılımımız birincil işlevdeki her komutu yürütür.
Bir sonraki adıma geçmeden önce prosedürü bir goroutin ile hızlı bir şekilde çalıştırabiliriz. Sonuç olarak bir scanln yöntemi eklendi; aksi takdirde kod, tüm sayıları göstermeden önce sona ererdi. Goroutines oluşturulması basittir ve çok sayıda yapılabilir. Bu yazılım çalıştırıldığında, goroutinlerin aynı anda değil, sırayla çalıştığını fark edeceksiniz.
Goroutines göre avantajları
Goroutines az maliyetlidir
Goroutines diğer işlemlerden daha ucuzdur. Kütle boyutu yalnızca birkaç kilobayttır ve yığın boyutunun tanımlanması gereken ve kalıcı olan iş parçacıklarının aksine, programın taleplerini karşılamak için genişleyebilir veya daralabilir.
Goroutines var
Çoğullandıkları çok az sayıda işletim sistemi iş parçacığı vardır. Yüzlerce goroutine sahip bir programda yalnızca bir süreç olabilir. Goroutinlerin geri kalanı yeni işletim sistemi sürecine aktarılır. Bu süreçteki herhangi bir goroutinin, örneğin kullanıcı müdahalesi ararken takılıp kaldığını varsayalım. Çalışma zamanı bunların her birini yönetir ve biz geliştiricilere, bu ince karmaşıklıklardan yalıtılırken aynı anda yönetmeleri için net bir API verilir.
Goroutines kanalları kullanarak iletişim kurar
Goroutines kanalları kullanarak konuşurlar. İlgili hafızayı paylaştıklarında yarış durumlarının oluşmasını önlemeye yöneliktir. Kanallar, goroutinlerin etkileşim kurmak için kullandıkları bir kanala benzetilebilir.
Kanallar nelerdir?
İki goroutin birbirleriyle etkileşime girebilir ve operasyonlarını kanallar üzerinden koordine edebilir. Bu yazılım sürekli olarak " ping " yazdıracaktır. Bir kanal formu belirlemek için, kanalda iletilen öğelere " chan " öneki eşlik eder." Bu durumda, dizeler sağlıyoruz. Kanalda mesajlar operatör kullanılarak gönderilir ve alınır. " ping " göndermeyi ifade eder. bir " ping ".
İki goroutini senkronize tutmak için bir kanal kullanılır. Yönlendirici, kanal üzerinden bir mesaj göndermeye çalışmadan önce, yazıcı mesajı kabul etmeye hazır olana kadar bekleyecektir. Bunun için terim inhibisyondur. Bir kanal oluştururken, make işlevi için ikinci bir parametre kullanılabilir: c:= make (chan int, 1)
Kanalın Yönü
Bir kanal formunun oryantasyonunu tanımlayabilir ve onu almak veya iletmek için parametreler tanımlayabiliriz. Örneğin, Pinger'ın yöntem işareti şu şekilde değiştirilebilir:
func pinger(c chan<- string)
C sadece şimdi gönderilebilir. c'den almak kod hatasına neden olur. Benzer şekilde, çıktıyı şu şekilde değiştirebiliriz:
func printer(c string -chan)
Bir yarı kanalın bu kısıtlamaları yoktur. Yalnızca iletim veya yalnızca kabul kanallarını kabul eden bir prosedüre iki yönlü bir kanal sağlanabilir, ancak bunun tersi geçerli değildir.
Goroutine nasıl yapılır?
Bir goroutine başlatma yöntemi basittir. Eşzamanlı olarak çalışacak bir goroutine yapmak için işlev çağrısına " go " anahtar sözcüğünü uygulayın. Burada bir goroutine yapacağız. Diyelim ki iki fonksiyon içeren bir programımız var: biri karşılama fonksiyonu, diğeri ise ana fonksiyon.
Yeni bir goroutine oluşturduğumuzda, karşılama () kodu, ana () işleviyle birlikte yürütülür. Bu programı uyguladığınızda şaşıracaksınız. Bu program sadece ana işlem metnini gösterir. Başlattığımız ilk goroutine veya yeni goroutine ne oldu? Bunun neden olduğunu anlamak için önce goroutinlerin iki ana özelliğini bilmeliyiz.
- Yeni bir goroutin oluşturduğumuzda goroutine işlevi anında yanıt verir. İşlevler dışında, yönetim goroutine güvenmez, bu nedenle yürütülmesini tamamlamasını beklemez. Yürütme, goroutine işlevinden sonra aşağıdaki kod bloğuna verilir. Bu nedenle goroutinden verilen herhangi bir parametre göz ardı edilir.
- Herhangi bir ekstra goroutin, birincil goroutin ile aynı anda çalışmalıdır. Ana goroutin başarısız olursa, program kapanır ve ek goroutinler çalışmaz.
Artık kodumuzun neden çalışmadığını anlıyorsunuz. Hoş Geldiniz() çağrısının ardından, merhaba goroutinin tamamlanması beklenmeden önce kontrol aşağıdaki kod satırına aktarıldı ve ana işlevin çıktısı alındı. Ana goroutine, gerçekleştirilecek bir senaryo olmadığı için öldü ve merhaba Goroutine'in çalışmasını engelledi.
Goroutini 1 saniye duraklatmak için uyku tekniğini ( time.sleep(1 * time.second)) çağırdık. Hoş Geldiniz () işlevinin artık ana goroutin çıkmadan önce tamamlanması için yeterli zamanı var. Bu yazılım ilk olarak " welcome goroutine " yazar ve ardından ana işlevi yazdırmadan önce bir saniye bekler. Diğer goroutinlerin tamamlanmasını sağlamak için bir an duraklatmak için birincil goroutinde uyku tekniğini kullanırız.
Birden çok Goroutines oluşturma
Birden çok goroutin oluşturmak için başka bir program başlatacağız. İlk önce paralel olarak çalışacak iki goroutin oluşturarak başlayabiliriz. Bu iki goroutin, sayı goroutinleri[go sayılar()] ve alfabe goroutinleri [ go alphabets ()].
Goroutin sayısı, 1 yazdırmadan önce 250 ms kalır, 2 yazdırmadan önce tekrar durur ve bu, 5'i üretene kadar böyle devam eder. Son olarak, birincil goroutin tamsayıları ve alfanümerik karakterleri oluşturur ve bir süre duraklar ve ardından ana goroutin sona erer.
Sık eşzamanlı programlama hataları
- Bu gerektiğinde senkronizasyonların olmaması
- Zamanı kullan. Senkronizasyon yapmak için uyku çağrıları
- Standart eşitleme paketindeki türlerin kopya değerlerini sarkan goroutinleri bırakın
- senkronizasyonu çağır
- bekleme grubu
- Yanlış yerlere yöntem ekle
- Kanalları, son işlevsel gönderici goroutinden değil, yarına yakın kanallar olarak kullanın
Çözüm
Bu makalede, bir goroutini ve aynı anda tamsayıları yazdıran birden çok goroutini başlatmak için go anahtar sözcüğünü kullanan bir program geliştirdik. Bu programı başlattıktan sonra, yeni bir kanal kurduk ve daha sonra sayıları bir goroutinde üretip, ekranda görüntülenebilmesi için başka bir goroutine iletiyorduk. Çok çekirdekli sistemlerde uygulamalarınızı hızlandırmak için bir goroutinin nasıl başlatılacağının son bir gösterimi olarak, aynı anda birçok "yazdırma" goroutini başlattınız.
Bildiğimiz gibi, goroutinler görevleri daha hızlı ve verimli bir şekilde gerçekleştirmenin bir yoludur. Bu, uygulamanızın işlevselliğini geliştirmek için AppMaster tarafından sunulan dağıtım prosedürlerinden biridir. AppMaster ile programlama bilgisi çok az olan veya hiç olmayan kişiler bile manuel kodlama yoluyla tamamlanması zor olan görevleri tamamlayabilir.
AppMaster, mobil ve web uygulamalarının yanı sıra bir arka uç oluşturabilen no-code bir platformdur. İlginç bir gerçek, AppMaster Go ile saniyede 22.000 satırlık bir arka uç oluşturur ve kaynak koduna erişebilirsiniz.