Golang ile fiziksel dosyada çalışırken dikkatli olmak -> mutex ile sync/atomic kullanmak

Mustafa Akseli
2 min readMay 27, 2023
Photo by Pankaj Patel on Unsplash

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 önce personLock.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şkene atomicPerson.Store() işlemi ile JSON verisi atanır. JSON verisini okurken atomicPerson.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 :)

--

--

Mustafa Akseli

#golang #php #backendDEV #golang #linuxcu #docker #bike #baba vee #motosiklet #entrepreneur #bulunsun