sync.Pool, geçici nesnelerin yeniden kullanımını sağlamak ve çöp toplayıcı üzerindeki baskıyı azaltmak için Go'da tanıtılmıştır. Tarihsel olarak geliştiriciler mutex kullanarak kendi nesne havuzlarını oluşturmuşlardır, ancak bu karmaşık koda ve senkronizasyon hatalarına yol açmıştır. sync.Pool, standart kütüphanede bulunan thread güvenli bir yapı olup, ilk erişimde nesne yaratmak, bu nesneyi depolamak ve sonrasında bu nesneyi havuza geri döndürmek için tasarlanmıştır.
Sorun şu: Kısa ömürlü nesnelerin (örneğin, HTTP sunucusundaki tamponlar) sayısı fazla olduğunda, sistem genellikle ayrıştırmalara çok zaman harcar. sync.Pool kullanımı, nesneleri isteğe bağlı olarak önbelleğe almayı sağlar ve bunların bellek içinde saklanma garantisi vermese de, çöp toplayıcı sayısını azaltarak performansı artırır.
Çözüm, geçici, homojen ve hızla kullanılan yapılar için Pool kullanmaktır (örneğin, bytes.Buffer) ve nesneyi Put yöntemiyle havuza geri döndürüp, Get ile çekmektir. Nesneler havuzdan herhangi bir zamanda (örneğin, GC çalıştığında) silinebilir; bu nedenle uzun vadeli depolama için uygun değildir.
Kod örneği:
import ( "sync" "bytes" "fmt" ) var bufPool = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) }, } func main() { b := bufPool.Get().(*bytes.Buffer) b.Reset() b.WriteString("hello, world!") fmt.Println(b.String()) bufPool.Put(b) // kesinlikle geri döndürmeliyiz }
Ana özellikler:
sync.Pool, uzun vadeli durum depolamak için kullanılabilir mi?
Hayır, Pool'daki herhangi bir nesne sistem tarafından herhangi bir anda (GC veya yük azaltıldığında) silinebilir. Pool yalnızca goroutine'ler arasında geçici depolama için tasarlanmıştır.
Pool, önceki konulmuş nesnenin tam olarak aynısını döndürür mü?
Hayır. Pool, uygun herhangi bir nesneyi döndürür veya gerekirse yeni bir tane oluşturur. Kullanıcı ve Pool nesnesi arasında bir bağlantı kurulmamalıdır.
Nesneyi Pool'a geri döndürmeden önce temizlemek/reset etmek gerekli mi?
Evet, aksi takdirde bir sonraki thread, önceki veri kalıntılarıyla "kirli" bir nesne alabilir.
Olumsuz Durum
Geliştirici, müşterilerin sohbet için tekrar bağlanmasını sağlamak amacıyla Pool'da durumlarını saklar. GC çalıştığında bağlantılar kaybolur ve kullanıcılar verilerini kaybeder.
Artılar:
Eksiler:
Olumlu Durum
JSON'ları marshal/unmarshal etmek için Buffer nesnelerini Pool'a yerleştirir ve mesajların toplu işlenmesinde kullanır. İşlem sonrası nesneler temizlenir ve havuza geri döndürülür, ayrıştırma sayısını azaltır.
Artılar:
Eksiler: