Golang ile fiziksel dosyada çalışırken dikkatli olmak -> mutex ile sync/atomic kullanmak
Golang kullanırken olurda json dosya üzerinde veri tutmanız gerekirse ve aynı anda birden fazla işlem bu dosya veya dosyalara erişim yani okuma&yazma işlemi yapması gerekiyorsa doğru yazıdasınız. Zira fiziksel dosya okuma ve yazma işlemlerinde bir işlem bitmeden diğer işlemin başlaması, dosya bütünlüğüne zarar verebilir. Bu durumda dosyanız tekrar okunamayacak daha da kötüsü içinde var olan önemli verinizin kaybolmasına sebep olacaktır.
“sleep” eklemeyi düşünmeyi bile aklınızdan geçirmeyin :) Sadece işlemlerinizi yavaşlatacaktır. Koda geçmeden açıklama yapmak gerekirse;
Atomiklik, işlemlerin bölünemez ve tutarlı bir şekilde gerçekleştirildiği anlamına gelir. Eğer birden fazla işlem aynı anda çalışıyorsa ve bu işlemler birbiriyle etkileşim içerisindeyse, atomik bir işlem yapmak önemli olabilir. Ancak, yalnızca JSON dosyası okuma işlemi için atomiklik gerekmeyebilir.
JSON dosyası okuma işlemi genellikle tek bir işlem olarak kabul edilir ve dosyanın disk üzerinden okunması ve belleğe yüklenmesiyle sınırlıdır. Bu tür bir işlem genellikle atomik olarak kabul edilebilir ve ayrıca Go dilinin standart kütüphanesinde yer alan
encoding/json
paketi kullanılarak basit bir şekilde gerçekleştirilebilir.Ancak, eğer birden fazla işlem aynı JSON dosyasına yazma veya güncelleme işlemi yapacaksa, atomiklik önem kazanabilir. Bu durumda, aynı anda çalışan işlemler birbirini etkileyebilir ve dosyanın tutarlı bir şekilde güncellenmesi gerekebilir. Bu tür senaryolarda, atomiklik sağlamak için işlemleri senkronize etmek veya kilitlemek amacıyla Go’nun
sync
paketi veya başka bir senkronizasyon mekanizması kullanabilirsiniz.Sonuç olarak, JSON dosyası sadece okunacaksa atomiklik genellikle gerekli olmayabilir. Ancak, eş zamanlı yazma veya güncelleme işlemleri yapılacaksa, atomiklik önem kazanabilir ve işlemlerin senkronize edilmesi gerekebilir.
Peki koda geçelim;
Bu örnekte,
sync.Mutex
adlı bir mutex kullanarak JSON dosyasının okuma işlemini atomik hale getiriyoruz. Mutex, bir işlem bu bölgeye girdiğinde diğer işlemlerin beklemesini sağlar.
personLock
adında bir mutex değişkeni oluşturuyoruz.main
fonksiyonunda JSON verisini okumadan öncepersonLock.Lock()
ile mutex'i kilitleyerek diğer işlemlerin beklemesini sağlıyoruz.defer personLock.Unlock()
ifadesi ile mutex'i kilidini açmayı unutmamış oluyoruz.Bu şekilde, sadece bir işlemin JSON dosyasını okumasına izin verilirken, diğer işlemler aynı kod parçasına eriştiğinde beklemek zorunda kalacaklardır.
Bu kod örneği, aynı JSON dosyasına eş zamanlı yazma veya güncelleme işlemleri yapmak için bir senkronizasyon mekanizması sağlar ve böylece dosyanın tutarlı bir şekilde güncellenmesini sağlar.
Sync paketi ile atomic kullanarak json dosya yazma işlemi ise;
Bu örnekte, JSON dosyasının okunması, güncellenmesi ve yazılması için senkronizasyon mekanizmaları kullanılıyor.
atomic.Value
tipi, atomik işlemler için kullanılır. İlk olarak,atomic.Value
tipinde bir değişken oluşturulur ve bu değişkeneatomicPerson.Store()
işlemi ile JSON verisi atanır. JSON verisini okurkenatomicPerson.Load()
işlemi kullanılır.JSON verisini güncelledikten sonra,
atomicPerson.Store()
işlemi ile veriyi atomik bir şekilde güncelleyerek diğer işlemlerle tutarlı bir şekilde paylaşırız. Ardından, güncellenmiş JSON verisini dosyaya yazabilirsiniz.Bu şekilde, JSON dosyasını atomik bir şekilde güncelleyebilir ve senkronizasyon mekanizmalarıyla paralel erişimi kontrol edebilirsiniz.
Eğer birden fazla json dosya okuyup yazmanız gerekiyorsa, farklı isimlerde mutex ler tanımlamanız önemli. Sadece bir lock işlemi yaparsanız performans kaybı yaşamanız muhtemeldir.
Buradaki kod örnek ve açıklamaları için ChayGPT ye teşekkürker :)