Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon bagaimana runtime Go menangani operasi saluran secara internal


bagaimana runtime Go menangani operasi saluran secara internal


Waktu proses Go menangani operasi saluran secara internal dengan menggunakan kombinasi struktur data dan algoritme untuk mengelola aliran data antar goroutine. Berikut adalah ikhtisar tingkat tinggi tentang bagaimana runtime Go menangani operasi saluran:

1. Pembuatan Saluran:

- Saluran Buffer: Saat saluran buffer dibuat, runtime Go mengalokasikan buffer untuk menyimpan data. Ukuran buffer ditentukan oleh kapasitas saluran.
- Saluran Tanpa Buffer: Saat saluran tanpa buffer dibuat, runtime Go tidak mengalokasikan buffer. Sebaliknya, ia menggunakan struktur data khusus yang disebut "antrean pengiriman" untuk mengatur aliran data.

2. Operasi Pengiriman:

- Antrian Kirim: Saat goroutine mengirim data ke saluran tanpa buffer, runtime Go menambahkan data tersebut ke antrean pengiriman.
- Saluran yang Disangga: Saat goroutine mengirim data ke saluran yang di-buffer, runtime Go akan menambahkan data tersebut ke buffer.

3. Operasi Penerimaan:

- Antrian Penerimaan: Saat goroutine menerima data dari saluran tanpa buffer, runtime Go akan menghapus data dari antrean pengiriman dan menambahkannya ke antrean penerimaan.
- Saluran yang Disangga: Saat goroutine menerima data dari saluran yang di-buffer, runtime Go akan menghapus data dari buffer.

4. Penutupan Saluran:

- Menutup Saluran: Saat saluran ditutup, runtime Go menyetel tanda yang menunjukkan bahwa saluran tersebut ditutup.
- Menerima dari Saluran Tertutup: Saat goroutine menerima data dari saluran tertutup, runtime Go mengembalikan nilai khusus yang disebut "nilai nol" untuk jenis saluran tersebut.

5. Manajemen Penyangga Saluran:

- Manajemen Buffer: Runtime Go mengelola buffer saluran yang di-buffer dengan mengalokasikan dan membatalkan alokasi memori sesuai kebutuhan.
- Pertumbuhan Buffer: Ketika buffer saluran yang di-buffer penuh, runtime Go mengalokasikan lebih banyak memori untuk meningkatkan ukuran buffer.

6. Pilihan Saluran:

- Pernyataan Pilih: Runtime Go menggunakan struktur data khusus yang disebut "antrean pilih" untuk mengelola pernyataan pilih.
- Operasi Pilih: Saat goroutine mengeksekusi pernyataan pilih, runtime Go akan memeriksa antrean pilih untuk menentukan saluran mana yang akan menerima.

7. Batas Waktu Saluran:

- Waktu habis: Waktu proses Go menggunakan struktur data khusus yang disebut "antrian batas waktu" untuk mengelola operasi batas waktu.
- Operasi Batas Waktu: Saat goroutine menjalankan operasi batas waktu, runtime Go akan memeriksa antrean batas waktu untuk menentukan apakah batas waktu telah terjadi.

8. Penanganan Kesalahan Saluran:

- Penanganan Kesalahan: Runtime Go menggunakan struktur data khusus yang disebut "antrean kesalahan" untuk mengelola operasi penanganan kesalahan.
- Operasi Kesalahan: Saat goroutine menjalankan operasi kesalahan, runtime Go akan memeriksa antrean kesalahan untuk menentukan apakah telah terjadi kesalahan.

Ini adalah cara utama runtime Go menangani operasi saluran secara internal. Runtime Go menggunakan kombinasi struktur data dan algoritma untuk mengelola aliran data antar goroutine, memastikan komunikasi yang efisien dan aman antar goroutine.

Kutipan:
[1] https://www.freecodecamp.org/news/how-to-handle-concurrency-in-go/
[2] https://www.bradcypert.com/go-channels/
[3] https://blog.devtrovert.com/p/go-channels-explained-more-than-just
[4] https://github.com/golang/go/blob/master/src/runtime/chan.go
[5] https://go101.org/article/channel.html