Bağlam, Go'da eşzamanlılık sağlayan kritik özelliklerden biridir. Go'da "bağlam", API sınırları boyunca istek kapsamlı değerler ve iptal sinyalleri için işlevsellik sağlayan bir paketi ifade eder.
Bağlam paketi, goyordam kavramına dayalı olarak Go'nun eşzamanlılık modeliyle eş zamanlı olarak çalışır. Goroutinler, verimli bir şekilde oluşturabileceğiniz ve yönetebileceğiniz, Go'da eşzamanlı programlar oluşturmayı kolaylaştıran hafif yürütme dizileridir.
Bağlam Paketi
Bağlam paketi, uzun süre çalışan işlevleri veya tüm çağrı zincirlerini iptal etmek için işlevsellik sağlar. Paket, çağrı zinciri içinde herhangi bir yere erişim için istek kapsamlı değerlerin depolanmasına da yardımcı olur. ile çalışırken bu özellik kullanışlıdır. API'ler veya isteklerin birden çok işlev çağrısını kapsadığı ve bunları iptal etmek veya bunlara belirli değerler eklemek istediğiniz mikro hizmetler.
Bağlam paketini şu şekilde içe aktarabilirsiniz: Git programları.
içe aktarmak"bağlam"
Bağlam işlevleri Bağlam bağlam paketinin yapı türü. Geleneksel olarak, kullanmalısınız ctx örnek değişkenin adı olarak.
işlevoperasyonlar(ctx bağlamı. Bağlam) {
}
İşlevler, diğer işlevler ve işlemler için Bağlam yapı türünü döndürebilir.
işlevoperasyonlar(ctx bağlamı. Bağlam)bağlam.Bağlam {
}
ile yeni bir bağlam oluşturabilirsiniz. YAPMAK bağlam paketinin işlevi. YAPILACAK işlevi, değeriyle yeni bir bağlam oluşturur. bağlam. Tamamlamak(), içerik iptal edildiğinde kapanacak bir kanal. Bir bağlama ihtiyaç duyduğunuzda ancak üst bağlamların hiçbiri uygun olmadığında bunu yer tutucu olarak kullanmalısınız.
içe aktarmak"bağlam"
işlevana() {
ctx := bağlam. YAPMAK()
}
Alternatif olarak, Arka plan işlevi, değeri olmayan yeni bir bağlam ve boş bir Bitti kanalı oluşturur.
ctx := bağlam. Arka plan()
Bağlam ağacının kökü olarak Arka Plan işlevini kullanmalısınız.
Değerlerle Bağlam
Bağlam paketi, yayılma değerleri ve iptal sinyalleri için işlevsellik sağlar. Değerleri, talep kapsamlı verilerden iptal sinyallerine ve son tarihlere kadar bilgi için kullanabilirsiniz.
Bağlam paketi ayrıca üst bağlamlardan devralınan alt bağlamın oluşturulmasına olanak tanıyarak verimli bağlamı birden çok kanaldan geçirebildiğiniz için, bir program boyunca değerlerin ve iptal sinyallerinin işlenmesi fonksiyonlar.
Bağlam paketi ile işlevler arasında bağlam geçirmeye bir örnek.
içe aktarmak (
"bağlam"
)işlevdeğerli Bağlam(ctx bağlamı. Bağlam)bağlam.Bağlam {
geri dönmek bağlam. Değer ile (ctx, "geçiş anahtarı", "hfouneqcelkwfu")
}
işlevBağlam Verilerini al(ctx bağlamı. Bağlam)herhangi {
geçişKey := ctx. Değer("geçiş anahtarı")
geri dönmek şifre
}
bu değerli Bağlam işlev bir bağlam örneğini alır ve aşağıdaki işlev için bir bağlam örneği döndürür. Bağlam örneği, ile oluşturulan bir değerdir. Değer ile yöntem. WithValue yöntemi, işlevden bağlam örneğini ve bir anahtar/değer çiftini alır.
Verileri bağlamdan almak için, ile yeni bir bağlam oluşturmanız gerekir. YAPMAK veya Arka plan işlevini kullanın ve bağlamı işleve iletin (bu durumda, ValueContext) ve bağlamı şu şekilde alın: Bağlam Verilerini al işlev.
işlevana() {
ctx := bağlam. Arka plan()
ctx = değerli Bağlam (ctx)
fmt. Println (ContextData (ctx) alma)
}
Ctx değişkeni, Arka Plan işlevindeki bağlam örneğidir. ValueContext işlevi, ctx değişkenini alır ve bağlamı, getContextData işlevinin aldığı bir değerle döndürür ve anahtar/değer çiftinden değeri döndürür.
Bağlam Zaman Aşımları ve Son Tarihler
bu bağlam paket, işlemlerde zaman aşımlarını ve son tarihleri ayarlamak için işlevsellik sağlar. Zaman aşımları ve son tarihler belirlemek, yetişmesi gereken işlemler için yararlıdır.
Zaman aşımları, bir işlemin aldığı süredir. Bir işlemin 4 saniye sürmesi için bir zaman aşımı süresi ayarlayabilirsiniz; bundan sonra içerik isteği iptal eder.
Öte yandan, bir son tarih, bir işlemin iptal edilmesi gereken mutlak noktayı tanımlar.
kullanabilirsiniz Zaman Aşımı İle bağlam zaman aşımı ayarlama yöntemi. 2 saniyelik bir zaman aşımını şu şekilde ayarlayabilirsiniz.
işlevana() {
ctx, iptal := bağlam. Zaman aşımı ile (bağlam. Arka plan(), 2 * zaman. Saniye)
ertelemek iptal etmek()
// bazı işlemler
}
bu ana işlev, iki saniyelik zaman aşımına sahip bir bağlam oluşturur. WithTimeout işlevi, ana işlevin çıkışında iptal için erteleyebileceğiniz bir iptal işlevi döndürür.
İle son teslim tarihlerini beyan edebilirsiniz. Son teslim tarihi ile yöntem. WithDeadline yöntemi, bir bağlam örneğini ve son teslim tarihini alır.
işlevbir şey yap(ctx bağlamı. Bağlam) {
son tarihZaman := zaman. Şimdi().Ekle(1500 * zaman. Milisaniye)
ctx, ctxCancel := bağlam. WithDeadline (ctx, son tarihZaman)
ertelemek ctxİptal()// bazı işlemler
ctxİptal()
}
bu bir şey yap işlev bir bağlam içinde alır ve son tarihZaman değişken, olaydan önceki zamandır. bağlam son teslim tarihi. bu ctx değişken, son teslim tarihi olan bağlamdır.
bu ctxİptal değişken, içerik son tarihini aştığında içeriği iptal eder.
Go'da Bağlamları Kullanmak İçin En İyi Uygulamalar
Bağlamları genel değişkenler olarak kullanmaktan kaçının. Bağlamları genel değişkenler olarak kullanmak, beklenmeyen kod davranışlarına ve izlenmesi zor hatalara yol açabilir ve kod karmaşıklığını azaltmak için bağlamı idareli kullanın.
Son olarak, bağlamları garanti olarak değil, sinyal olarak kullanın. Bir bağlamın iptal edilmesi, tüm goyordamların çalışmayı durduracağını garanti etmez; bu sadece bir sinyaldir ve gorutinler bağlamlardan bağımsızdır.