Dasar-dasar Goroutine
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 59 dari 107.
goroutine adalah thread eksekusi ringan yang dikelola oleh runtime Go. Tidak seperti thread tradisional yang menggunakan banyak memori, goroutine dimulai hanya dengan beberapa kilobyte ruang stack, sehingga kamu dapat menjalankan ribuan goroutine secara bersamaan.
Untuk memulai goroutine, cukup letakkan kata kunci go sebelum pemanggilan fungsi:
func sayHello(name string) {
fmt.Println("Hello,", name)
}
func main() {
go sayHello("Alice") // berjalan secara bersamaan
go sayHello("Bob") // berjalan secara bersamaan
time.Sleep(100 * time.Millisecond)
fmt.Println("Done")
}Saat go sayHello("Alice") dijalankan, program tidak menunggu sayHello selesai. Sebaliknya, program langsung melanjutkan ke baris berikutnya sementara sayHello berjalan di latar belakang. Karena itu, kita memerlukan time.Sleep. Tanpanya, main akan keluar sebelum goroutine selesai.
Kamu juga bisa menjalankan goroutine dengan fungsi anonim:
go func(msg string) {
fmt.Println(msg)
}("Hello from goroutine")Fungsi main sendiri berjalan dalam goroutine. Saat fungsi itu selesai, semua goroutine lainnya langsung dihentikan. Mereka tidak mendapat kesempatan untuk menyelesaikan tugasnya. Menggunakan time.Sleep adalah solusi sementara. Dalam pelajaran berikutnya, kamu akan mempelajari teknik sinkronisasi yang tepat dengan channel dan wait group.
Tantangan
MudahMari kita buat task runner yang menjalankan beberapa task secara bersamaan menggunakan goroutine. Kamu akan membuat sistem sederhana tempat task berjalan di latar belakang sementara program utama terus berjalan, untuk menunjukkan cara goroutine memungkinkan eksekusi bersamaan.
Kamu akan mengatur kodemu dalam dua file:
tasks.go: Tentukan logika eksekusi task.Buat struct
Taskdengan fieldName(string) danDuration(int, yang menyatakan milidetik).Terapkan method
Run()padaTaskyang menyimulasikan pekerjaan dengan tidur selama durasi task, lalu mencetak:Task [Name] completedBuat fungsi
RunAllTasks(tasks []Task)yang menjalankan methodRun()setiap task sebagai goroutine. Setelah menjalankan semua goroutine, fungsi tersebut harus tidur selama 500 milidetik agar goroutine selesai, lalu mencetak:All tasks launchedmain.go: Baca informasi task dan atur eksekusi bersamaan.Baca jumlah task, lalu baca nama dan durasi setiap task. Buat task dan berikan ke
RunAllTasks. Setelah fungsi tersebut selesai, cetak:Main function done
Input berikut akan diberikan:
- Baris 1: Jumlah task (integer)
- Baris-baris berikutnya: Untuk setiap task, dua baris, yaitu nama task, lalu durasinya dalam milidetik
Contohnya, jika diberikan:
3
Download
100
Process
50
Upload
75Output kamu harus menampilkan task yang selesai (urutannya dapat berbeda karena eksekusi bersamaan), diikuti pesan penyelesaian:
Task Process completed
Task Upload completed
Task Download completed
All tasks launched
Main function doneCatatan: Karena goroutine berjalan secara bersamaan, task dengan durasi lebih singkat biasanya selesai lebih dahulu. Urutan penyelesaian task bergantung pada durasinya, task yang lebih singkat selesai sebelum task yang lebih lama.
Gunakan time.Sleep dengan time.Duration dan time.Millisecond untuk jedanya. Ingat, tanpa jeda di RunAllTasks, fungsi tersebut akan selesai sebelum goroutine menuntaskan pekerjaannya.
Coba sendiri
package main
import (
"fmt"
)
func main() {
// Baca jumlah tugas
var numTasks int
fmt.Scanln(&numTasks)
// TODO: Buat slice untuk menyimpan tugas
// TODO: Baca nama dan durasi setiap tugas
// Untuk setiap tugas:
// - Baca nama tugas
// - Baca durasi (sebagai bilangan bulat)
// - Buat Task dan tambahkan ke slice-mu
// TODO: Panggil RunAllTasks dengan slice tugasmu
// TODO: Cetak "Main function done"
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online