𝗞𝘂𝗮𝘀𝗮𝗶 𝗚𝗼 𝗖𝗼𝗻𝗰𝘂𝗿𝗿𝗲𝗻𝗰𝘆 𝗱𝗲𝗻𝗴𝗮𝗻 𝗖𝗵𝗮𝗻𝗻𝗲𝗹𝘀

Saya pernah membina pipeline pemprosesan imej dalam Go.

Saya menggunakan goroutines untuk setiap langkah. Saya menghubungkannya dengan channels. Saya tekan run.

Program tersebut membeku. Penggunaan memori meningkat. Kemudian ia mati. Tiada ralat yang muncul. Hanya kesunyian.

Saya membazirkan masa berjam-jam menyahpepijat (debugging) scheduler yang rosak. Saya silap. Saya tidak faham bagaimana channels berfungsi.

Berikut adalah tiga peraturan untuk mengelakkan program Go anda daripada tergantung (hanging).

  1. Nil channels adalah lubang hitam Satu nil channel akan menyekat (block) selama-lamanya. Jika anda menghantar atau menerima pada nil channel, goroutine tersebut akan tersangkut.
  1. Peraturan penutupan mengelakkan panic Menutup channel adalah kekal.
  1. Gunakan arah channel untuk keselamatan Go membolehkan anda menentukan sama ada channel adalah untuk menghantar atau menerima.

Cara membina pipeline yang bersih:

Apabila anda mengikut corak ini, anda dapat mengelakkan kebocoran (leaks) dan panic. Anda membina sistem yang mudah diuji dan teguh (robust).

Cabaran anda: Tulis satu fungsi yang menggabungkan beberapa input channel ke dalam satu output channel. Gunakan gelung select. Tambahkan timeout 500ms. Pastikan tiada goroutine yang bocor (leak).

Hantarkan penyelesaian anda di ruangan komen.

Sumber: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79