Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
24 Jun 2023 · 2 mnt baca ·Artikel 107 / 119
Go

Mengenal Sync Pool Pada Golang

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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 dari Pool, lalu menghapusnya dari Pool tersebut dan mengembalikan data yang telah diambilnya.
  • Put(x any) digunakan untuk menyimpan data ke dalam Pool yang 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.

go
 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}
Dan jika kita jalankan, kita akan melihat outputnya seperti dibawah ini:
bash
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.

Artikel Terkait

💬 Komentar