Bobea katika Go Concurrency kwa Kutumia Channels
Wakati mmoja nilijenga mfumo wa usindikaji wa picha (image processing pipeline) katika Go.
Nilitumia goroutines kwa kila hatua. Niliunganisha kwa kutumia channels. Nikabonyeza 'run'.
Programu iliganda. Matumizi ya kumbukumbu (memory usage) yalipanda. Kisha ikafa. Hakukuwa na makosa. Kulikuwa na ukimya tu.
Niliharibu saa nyingi nikijaribu kutafuta hitilafu (debugging) kwenye scheduler iliyoharibika. Nilikuwa nimekosea. Sikuelewa jinsi channels zinavyofanya kazi.
Hizi hapa ni sheria tatu za kuzuia programu zako za Go zisigande.
- Channels za nil ni mashimo meusi Channel ya nil inazuia (blocks) milele. Ukituma au kupokea kwenye channel ya nil, goroutine itabaki imekwama.
- Daima anzisha channels zako kwa kutumia
make. - Tumia ukaguzi wa nil ikiwa huna uhakika.
- Sheria za kufunga huzuia panics Kufunga channel ni jambo la kudumu.
- Ni mtumaji pekee anayepaswa kufunga channel.
- Kutuma data kwenye channel iliyofungwa husababisha panic.
- Tumia thamani ya pili inayorejeshwa ili kuangalia ikiwa channel imefungwa:
v, ok := <-ch. - Ikiwa
oknifalse, channel imefungwa.
- Tumia mwelekeo wa channel kwa usalama Go inakuwezesha kubainisha ikiwa channel ni ya kutuma au kupokea.
chan<- intinamaanisha unaweza kutuma data pekee.<-chan intinamaanisha unaweza kupokea data pekee.- Hii inailazimisha compiler kukamata makosa kabla ya kuendesha kodi yako.
Jinsi ya kujenga pipeline safi:
- Tumia
defer closeili kuhakikisha channel inafungwa mara moja tu. - Tumia
rangeili kupitia channels. Hii inasimama yenyewe wakati channel inapofungwa. - Weka aina za mwelekeo (direction types) kwenye functions zako ili kuunda mikataba thabiti.
Unapofuata mifumo hii, unazuia uvujaji (leaks) na panics. Unajenga mifumo ambayo ni rahisi kufanyia majaribio na imara.
Changamoto yako:
Andika function inayounganisha channels nyingi za pembejeo (input channels) kuwa channel moja ya matokeo (output channel). Tumia select loop. Ongeza timeout ya 500ms. Hakikisha hakuna goroutines zinazovuja.
Weka suluhisho lako kwenye maoni.