Pola Semaphore
Membatasi konkurensi dengan semaphore berbasis channel
Pola Semaphore adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Apa itu semafor?
Semafor membatasi jumlah goroutine yang melakukan operasi secara konkuren. Semafor mencegah kehabisan sumber daya (misalnya, terlalu banyak koneksi DB terbuka atau permintaan HTTP keluar).
Saluran berbuffer sebagai semafor
Saluran berbuffer berkapasitas N berfungsi sebagai semafor penghitung. Akuisisi mengirim ke saluran (memblokir saat saluran penuh); pelepasan menerima dari saluran.
sem := make(chan struct{}, 10)
func withSem(f func()) {
sem <- struct{}{} // acquire
defer func() { <-sem }() // release
f()
}Satu goroutine per pekerjaan dengan semafor
Jalankan satu goroutine untuk setiap pekerjaan, tetapi batasi konkurensi dengan semafor:
sem := make(chan struct{}, 5)
for _, job := range jobs {
sem <- struct{}{}
go func(j Job) {
defer func() { <-sem }()
process(j)
}(job)
}Mengosongkan semafor di akhir
Setelah meluncurkan semua goroutine, kosongkan semafor untuk memastikan semuanya selesai sebelum fungsi mengembalikan hasil:
// After the loop, acquire all N slots (blocks until all goroutines release)
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}golang.org/x/sync/semaphore
Untuk semafor berbobot (misalnya, goroutine dengan bobot sumber daya yang berbeda), gunakan tipe semaphore.Weighted:
s := semaphore.NewWeighted(100)
// acquire 10 units
if err := s.Acquire(ctx, 10); err != nil { return err }
defer s.Release(10)
// do workAkuisisi berbasis konteks
Acquire pada semafor berbobot menghormati konteks dan mengembalikan galat jika pembatalan terjadi sebelum semafor tersedia.
TryAcquire
s.TryAcquire(n) memperoleh n unit hanya jika unit tersebut langsung tersedia, dan mengembalikan false jika tidak. Berguna untuk pemeriksaan tanpa pemblokiran.
Semafor dibandingkan dengan kumpulan pekerja
Kumpulan pekerja memiliki sejumlah goroutine permanen yang tetap. Semafor memungkinkan Anda menjalankan goroutine sesuai kebutuhan sambil membatasi konkurensi. Gunakan semafor ketika laju kedatangan pekerjaan sangat bervariasi.
Pembatasan konkurensi HTTP
Bungkus penangan atau klien HTTP dengan semafor untuk mencegah terlalu banyak permintaan keluar atau goroutine penangan yang berjalan secara konkuren.
Pembatasan koneksi basis data
Sebagai pengganti semafor, tetapkan db.SetMaxOpenConns(n) dan db.SetMaxIdleConns(m) — paket sql mengelola konkurensi kumpulan koneksi secara internal.
Keadilan semafor
Semafor saluran berbuffer kurang lebih adil (FIFO untuk goroutine yang terblokir saat mengirim), tetapi tidak dijamin secara ketat. Paket semafor berbobot memberikan jaminan keadilan yang lebih ketat.
Pemeriksaan Singkat
Bagaimana kanal berpenyangga menerapkan semafor?
Ringkasan: Pola Semafor
Poin-poin utama:
- Kanal berpenyangga sem := make(chan struct{}, N) untuk semafor sederhana
- Kirim untuk memperoleh akses; terima untuk melepaskan akses; selalu gunakan defer untuk pelepasan
- golang.org/x/sync/semaphore untuk varian berbobot yang sadar konteks
- Gunakan errgroup.SetLimit untuk batas konkurensi sederhana per grup
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Semaphore” gratis?
Ya — teks lengkap “Pola Semaphore” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pola Semaphore”?
Membatasi konkurensi dengan semaphore berbasis channel Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pola Semaphore” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pola Pipeline dan Tahap
- errgroup untuk Penanganan Error Konkuren
- Pola Semaphore
- Deteksi Kebocoran dan Pembatalan