Go Context ve Cancellation Nedir?

Ömer Burak Demirpolat
3 min readJan 28, 2021

--

Selamlar, bu yazının konusu Context ve Cancellation. Bildiğim, öğrendiğim kadarıyla aktaracağım.

Context bir eşzamanlı işlerin yönetiminde kullanılan built-in bir paket.

Context’in çıkış amacı ise Cancellation. Peki Cancellation nedir?

Bu konuyu basit bir örnek ile aktarmak istiyorum.

Bir web uygulaması hayal edelim ve bu uygulamada kullanıcı bir video indirmek üzere Server’a istekte bulunuyor. Server ise Video servisine bağlanarak video kaydını indirmeye başlıyor. İşlem bittiğinde ise kullanıcıya indirilen dosyayı veya hata alındıysa hatayı iletecek.

Bu senaryoda olası ihtimallerden birisi Video Servisleri bir süre hizmet vermeyi kesebilir.

Bir diğer ihtimal ise indirme işlemi henüz tamamlanmadan kullanıcı indirme işleminden vazgeçebilir.

Varsayalım ki Video’nun henüz %50'si indirilmiş durumda ve kullanıcı beklemekten sıkılıp web sayfasından çıkış yaptı.

Fakat çalışan video indirme işlevimizin bundan haberi yok ve indirme işlemi tamamlanana dek çalışmaya devam edecek.

Neden kaynakları boşa tüketelim, kullanıcının ihtiyacı kalmamış bir veriyi neden indirelim?

Context paketi burada devreye giriyor. Context paketi sayesinde kullanıcının başlattığı web isteği ile video indirme işlevi arasında bir bağ kurulmasını ve kullanıcının web isteğinin iptal edilmesi durumunda video indirme işlevinin iptal edilmesini sağlayacak. Cancellation tam olarak budur.

Bu örneği koda dökerken Context paketinin WithCancel metodunu kullanıcam. Ayrıca Context paketinin diğer metodlarına da göz atmanızı öneririm.

Öncelikle 3010 portundan sunulan bir uygulama hazırlayalım. Bu uygulama cevap vermekte güçlük çeken aciz bir sunucuyu canlandıracak. 100 saniye boyunca bize yanıt veremeyecek.

Yukarıdaki kodda görüldüğü üzere “localhost:3010/badserver” adresine bir istek geldiğinde uygulamamız 100 saniye sonra yanıt verebilecek.

Şimdi ise kullanıcının istekte bulunup video indirmeye çalışacağı uygulamayı 3009 portundan sunalım.

Go 1.7 versiyonu ile birlikte Context paketi built-in olarak gelmeye başladı.

Peki yukarıdaki kodun hikayesi nedir, neler oluyor?

“net/http” paketinde client tarafından gelen her request bir Context ile birlikte geliyor.

Peki biz bu request ile gelen Context ne işimize yarayacak?

Kullanıcımız henüz devam eden indirme isteğini kestiğinde bu Context sayesinde “handler” fonksiyonu sonlandırılıyor. Biz ise bu request içerisinde gelen Context’e bağlı yeni bir Context oluşturduk. Yani “handler” fonksiyonu sonlandırıldığında bizim buna bağlı oluşturduğumuz indirme isteği de sonlanacak.

11. satırda request’in Context’inden “handler” fonksiyonu için bir Context türetildi. Buna “Derived Contexts” adı veriliyor.

Kodun devamında ise yeni türettğimiz Context ile video indirmek için “3010” portundan sunduğumuz kötü server’a istek gönderiyoruz.

Şimdi öncelikle bir terminal ekranı açıp badserver.go’yu çalıştıralım.

// Port : 3010
go run badserver.go

Yeni bir termianl ekranı ve

// Port : 3009
go run main.go

Şimdi 3009 portundan sunduğumuz uygulamamıza video indirmek için isteği gönderelim.

curl localhost:3009/download

Şu an indirmem kullanıcımız için istekte bulunduğumuz dosyanın %20'si indirildi ve tam bu sırada kullanıcımız indirme işleminden vazgeçti. ^C

select {
case <-ctx.Done():
fmt.Println(ctx.Err())
default:
fmt.Println("Request done")
}

Kullanıcımız indirme işlemini iptal ettiği anda Context iptal oldu ve dosyanın geri kalanını indirmek zorunda kalmamış olduk.

Tşkkrlr

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response