Kanallar ile Go Eşzamanlılığında Ustalaşın

Bir keresinde Go ile bir görüntü işleme hattı (pipeline) kurmuştum.

Her adım için goroutine'ler kullandım. Onları kanallarla birbirine bağladım. Çalıştırdım.

Program dondu. Bellek kullanımı tırmandı. Sonra çöktü. Hiçbir hata yoktu. Sadece sessizlik vardı.

Bozuk bir zamanlayıcıyı (scheduler) hata ayıklamak için saatlerimi harcadım. Yanılmışım. Kanalların nasıl çalıştığını anlamamıştım.

Go programlarınızın asılı kalmasını önlemek için işte üç kural.

  1. Nil kanallar kara deliktir Nil bir kanal sonsuza kadar bloklar. Nil bir kanala veri gönderirseniz veya ondan veri alırsanız, goroutine takılı kalır.
  1. Kapatma kuralları panikleri önler Bir kanalı kapatmak kalıcıdır.
  1. Güvenlik için kanal yönlerini kullanın Go, bir kanalın gönderme mi yoksa alma amaçlı mı olduğunu belirtmenize olanak tanır.

Temiz bir pipeline nasıl oluşturulur:

Bu desenleri takip ettiğinizde, sızıntıları (leaks) ve panikleri önlersiniz. Test edilmesi kolay ve sağlam sistemler inşa edersiniz.

Sizin meydan okumanız: Birden fazla giriş kanalını tek bir çıkış kanalında birleştiren bir fonksiyon yazın. Bir select döngüsü kullanın. 500ms'lik bir zaman aşımı (timeout) ekleyin. Hiçbir goroutine sızıntısı (leak) olmadığından emin olun.

Çözümünüzü yorumlarda paylaşın.

Kaynak: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79