Možne pomanjkljivosti uporabe kanalov brez medpomnjenja v obsežni aplikaciji vključujejo:
1. Sinhronizacijske točke: Kanali brez medpomnjenja ustvarijo sinhronizacijske točke, kjer morajo podprogrami čakati drug na drugega, da se dokončajo. To lahko privede do zaporednega izvajanja, kar morda ni zaželeno v obsežni aplikaciji, kjer je vzporednost bistvena[1][3][5].
2. Skriti pogoji tekmovanja: Kanali brez medpomnilnika lahko skrijejo pogoje tekmovanja, ki bi se pojavili z velikostjo medpomnilnika, večjo od nič. To pomeni, da če morate zaradi zmogljivosti povečati velikost medpomnilnika, boste nenadoma morali rešiti kup pogojev dirke, kar je lahko oblika tehnološkega dolga[1].
3. Blokiranje: kanali brez medpomnjenja blokirajo tako pošiljatelja kot prejemnika, dokler druga stran ni pripravljena. To lahko privede do težav z zmogljivostjo, če je prejemnik počasnejši od pošiljatelja ali če za kanal tekmuje veliko goroutin[2][3][5].
4. Omejena razširljivost: kanali brez medpomnjenja lahko omejijo razširljivost vaše aplikacije, ker ustvarjajo ozko grlo, kjer morajo goroutine čakati druga na drugo, da se dokončajo. To lahko privede do situacije, ko aplikacija ne uporablja v celoti razpoložljivih virov procesorja[1][3][5].
5. Zapletenost: kanali brez medpomnjenja lahko dodatno zapletejo vašo aplikacijo, ker zahtevajo skrbno upravljanje, da se zagotovi, da goroutine niso blokirane za nedoločen čas. To lahko povzroči težje odpravljanje napak in vzdrževanje[1][3][5].
6. Zmogljivost: kanali brez medpomnjenja lahko vplivajo na zmogljivost, ker ustvarjajo dodatne stroške za goroutine, ki čakajo druga na drugo. To lahko privede do počasnejših odzivnih časov in zmanjšane prepustnosti[2][3][5].
7. Obravnava napak: Kanali brez medpomnjenja lahko otežijo obravnavanje napak, ker lahko povzročijo zastoje, če podprogrami niso pravilno sinhronizirani. To lahko vodi do bolj zapletenega obravnavanja napak in odpravljanja napak[1][3][5].
Če povzamemo, medtem ko so kanali brez medpomnjenja lahko uporabni v določenih situacijah, lahko povzročijo tudi pomembne pomanjkljivosti v obsežni aplikaciji. Bistveno je, da skrbno pretehtate kompromise in izberete ustrezno vrsto kanala glede na posebne zahteve vaše aplikacije.
Citati:[1] https://www.reddit.com/r/golang/comments/9cqcx4/help_understanding_the_use_cases_and_pitfalls_of/
[2] https://www.linkedin.com/pulse/buffered-unbuffered-channels-golang-lucas-schenkel-schieferdecker
[3] https://www.scaler.com/topics/golang/buffered-and-unbuffered-channel-in-golang/
[4] https://clavinjune.dev/en/blogs/buffered-vs-unbuffered-channel-in-golang/
[5] https://notes.shichao.io/gopl/ch8/