Kode program membuat context

Golang – Pengenalan dan cara menggunakan context

Context merupakan sebuah data yang isinya membawa value, sinyal cancel, sinyal timeout dan sinyal deadline. Context biasanya dibuat per request(misal setiap ada request masuk ke server melalui http request), context digunakan untuk mempermudah kita meneruskan value, dan sinyal antar proses.

Kenapa context perlu dipelajari

Context di golang biasa digunakan untuk mengirim data request atau sinyal ke proses lain atau dari gorutine ke goroutine yang lain. Dengan menggunakan context, ketika kita ingin membatalkan sebuah proses, kita cukup mengirim sinyal ke context nya, maka secara otomatis semua proses akan dibatalkan.

Hampir semua bagian di golang memanfaatkan context, seperti database, http server, http client, dan lain-lain. Bahkan di Google sendiri, ketika menggunakan golang, context wajib digunakan dan selalu dikirim ke setiap function.

Context direpresentasikan di dalam sebuah interface Context, interface Context terdapat dalam package context https://pkg.go.dev/context

Membuat context

Karena context adalah sebuah interface, untuk membuat context kita butuh sebuah struct yang sesuai dengan kotrak interface Context. Namun kita tidak perlu membuat secara manual, di golang package context terdapat function yang bisa kita gunakan untuk membuat Context.

FunctionKeterangan
context.Background()Membuat context kosong. Tidak pernah dibatalkan, tidak pernah timeout, dam tidak memiliki value apapun. Biasanya digunakan di main function atau dalam test, atau dalam awal request proses terjadi.
context.Todo()Membuat context kosong seperti Background(), namun biasanya menggunakan ini ketika belum jelas context apa yang ingin digunakan.
Function membuat context

Berikut contoh pembuatan context pada golang

Kode program membuat context
Kode program membuat context

Parent dan child context

Context menganut konsep parent dan child. Artinya, saat kita membuat context, kita bisa membuat child context dari context yang sudah ada. Parent context bisa memiliki banyak child, namun child hanya bisa memiliki satu parent context. Konsep ini mirip dengan pewarisan di pemtogaman berorientasi object.

Parent dan child context akan selalu terhubung dan tidak bisa dilepas, saat nanti kita melakukan misal pembatalan context A, maka semua child dan sub child dari context A akan ikut dibatalkan. Namun jika misal kita membatalkan context B, hanya context B dan semua child nya yang dibatalkan, parent context B tidak akan ikut dibatalkan.

Begitu juga nanti saat kita menyisipkan data ke context A, semua child dan sub child dapat mendapatkan context tersebut. Namun jika kita menyisipkan data ke context B, hanya context B dan semua child dan sub child nya yang mendapatkan data tersebut, parent context B tidak akan mendapatkan data.

Context merupakan data yang immutable, artinya setelah context dibuat, dia tidak bisa diubah lagi. Dan ketika kita menambahkan value ke dalam context, atau menambahkan pengaturan timeout dan yang lainnya, secara otomatis akan membentuk child context baru, bukan merubah context tersebut.

Context with value

Pada saat awal membuat context, context tidak memiliki value. Kita bisa menambahkan sebuah value dengan data Pair (key – value) ke dalam context, saat kita menambahkan value ke context secara otomatis akan tercipta child context baru, artinya original context nya tidak akan berubah sama sekali. Untuk menambahkan value ke context kita bisa menggunakan function context.WithValue(parent, key, value).

Kode program context with value
Kode program context with value

Setelah bisa memberikan value pada context selanjutnya kita akan mencoba mengambil data value nya, untuk mengambil data value kita bisa gunakan context.Value(key).

Kode program get value context
Kode program get value context

Perhatikan baris 18 dan 19 yang mana kita mengambil value nya dan menampilkan ke layar.

Context with cancel

Selain menambahkan value ke context, kita juga bisa menambahkan sinyal cancel ke context. Kapan sinyal cancel diperlukan dalam context ?

Biasanya ketika kita butuh menjalankan proses lain atau goroutine, dan kita ingin memberi sinyal cancel ke proses tersebut. Biasanya proses ini berupa goroutine yang berbeda, sehingga dengan mudah jika kita ingin membatalkan eksekusi goroutine, kita bisa mengirim sinyal cancel ke context nya. Namun ingat, goroutine yang menggunakan context tetap harus melakukan pengecekan terhadap context nya, jika tidak maka tidak ada gunanya. Untuk membuat context dengan cancel signal kita bisa menggunakan function context.WithCancel(parent) . Berikut contohnya

Kode program context with cancel
Kode program context with cancel

Pada contoh diatas kita membuat kondisi dimana kita akan menjalankan 2 goroutine dengan context, kemudian kita ingin jika salah satu dari goroutine selesai maka akan melakukan cancel pada context nya, istilah nya siapa yang lambat akan di cancel proses nya. Dan disini kita juga sengaja membuat goroutine 2 lebih lambat dengan menambahkan Sleep selama 1 detik. Kemudian coba jalankan dan expected nya adalah goroutine 1 selesai dan goroutine 2 di cancel.

Output kode program context with cancel
Output kode program context with cancel

Context with timeout

Selain menambahkan value ke context, dan juga sinyal cancel, kita juga bisa menambahkan sinyal cancel ke context secara otomatis dengan pengaturan timeout. Dengan menggunakan pengaturan timeout, kita tidak perlu melakukan eksekusi cancel secara manual, cancel akan otomatis di eksekusi jika waktu timeout sudah terlewati. Penggunaan context dengan timeout sangat cocok ketika misal kita melakukan query ke database atau http api, namun ingin menentukan batas maksimal timeout nya.

Untuk membuat context dengan cancel signal secara otomatis menggunakan timeout, kita bisa menggunakan function context.WithTimeout(parent, duration).

Kode program context with cancel
Kode program context with cancel

Pada kode program diatas, kita membuat context dengan timeout pada baris 12, dan pada context tersebut sebenar nya juga me return cancel yang akan kita gunakan di baris 13 untuk memastikan jika context di close setelah function selesai di eksekusi. Hal ini berfungsi ketika eksekusi function lebih cepat dari timeout yang diberikan.

Context with deadline

Selain menggunakan timeout untuk melakukan cancel secara otomatis, kita juga bisa menggunakan deadline. Pengaturan deadline sidikit berbeda dengan timeout, jika timeout kita beri waktu dari sekarang, nah jika deadline ditentukan kapan waktu timeout nya, misal jam 12 siang hari ini.

Untuk membuat context dengan cancel signal secara otomatis menggunakan deadline, kita bisa menggunakan function context.WithDeadline(parent, time).

Kode program context with deadline
Kode program context with deadline

Untuk penggunaan deadline sebenar nya sama saja dengan timeout sebelumnya, yang berbeda hanya method dan parameter nya saja di baris ke 12.

Penutup

Pada artikel kali ini kita telah belajar tentang context pada bahasa pemrogaman go. Dan pada artikel selanjutnya saya akan membahas tentang database pada bahasa pemrogaman go.

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar

About Me

About Me

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam.

Social Profiles

Facebook