Mengenal Sync Pool Pada Golang
Pengenalan sync.Pool
sync.Pool sering kita dengar saat implementasi design patter yaitu bernama Object Pool Pattern. Pool adalah sekumpulan objek sementara yang dapat disimpan dan diambil secara individual. Sebuah Pool aman untuk digunakan oleh beberapa goroutine secara bersamaan.
sync.Pool memungkinkan kita untuk menggunakan kembali memori tanpa mengalokasikan. Juga jika kita memiliki server http yang menunggu request POST dengan body json dan harus melakukan decode ke dalam struktur, maka kamu bisa menggunakan sync.Pool untuk menghemat memory dan mengurangi waktu response dari server.
Kenapa kita harus menggunakan sync.Pool?
Tujuan Pool adalah untuk penyimpanan item sementara yand dialokasikan tetapi tidak terpakai untuk digunakan kembali sehingga mengurangi pengumpulan dari garbage collactor.
Penggunaan Pool yang tepat memang digunakanuntuk mengelola sekelompok item sementara yang dibagikan dan bisa digunakan kembali oleh client secara independen.
Hal yang terpenting yang perlu kita catat bahwa Pool memiliki cost untuk performanya sendiri. Jau lebih lambat untuk menggunakan sync.Pool dari pada inisialisasi sederhana.
Penggunaan
sync.Pool memberikan beberapa method yang sudah disediakan diantaranya:
Get()digunakan untuk mengambil data dariPool, lalu menghapusnya dari Pool tersebut dan mengembalikan data yang telah diambilnya.Put(x any)digunakan untuk menyimpan data ke dalamPoolyang sudah kita inisialisasi.
Implementasi dan sampel sync.Pool
Sekarang kita akan coba bagaimana simpelnya mengimplementasikan sync.Pool. Pertama, kita akan menggunakan sync.Pool diaman kita akan menjadikan suatu fungsi yang melakukan generate suatu objek dan mengembalikan data ketika akan dipanggil.
1package main
2
3import (
4 "fmt"
5 "sync"
6)
7
8type Person struct {
9 Name string
10}
11
12var pool = sync.Pool{
13 New: func() any {
14 fmt.Println("Creating a new person...")
15 return &Person{}
16 },
17}
18
19func main() {
20 person := pool.Get().(*Person)
21 fmt.Println("Get object from sync.Pool for the first time:", person)
22
23 fmt.Println("Put the object back in the pool")
24 pool.Put(person)
25
26 person.Name = "Gopher"
27 fmt.Println("Set object property name:", person.Name)
28
29 fmt.Println("Get object from pool again (it's updated):", pool.Get().(*Person))
30 fmt.Println("There is no object in the pool now (new one will be created):", pool.Get().(*Person))
31}1$ go run main.go
2Creating a new person...
3Get object from sync.Pool for the first time: &{}
4Put the object back in the pool
5Set object property name: Gopher
6Get object from pool again (it's updated): &{Gopher}
7Creating a new person...
8There is no object in the pool now (new one will be created): &{}Kesimpulan
Perhatikan kita tahu bagaiman ketika kita mengeluarkan data tersebut dari Pool maka akan menghilang didalam Pool tersebut sehingga ini cocok digunakan untuk menyimpan beberapa objek sementara yang dibagikan diantara goroutine.