ఛానెల్స్తో Go Concurrencyని పట్టుకోండి
నేను ఒకసారి Goలో ఒక ఇమేజ్ ప్రాసెసింగ్ పైప్లైన్ను నిర్మించాను.
ప్రతి దశ కోసం నేను goroutines ఉపయోగించాను. వాటిని ఛానెల్స్తో అనుసంధానించాను. రన్ చేశాను.
ప్రోగ్రామ్ ఫ్రీజ్ అయిపోయింది. మెమరీ వినియోగం పెరిగింది. ఆపై అది ఆగిపోయింది. ఎటువంటి ఎర్రర్స్ లేవు. కేవలం నిశ్శబ్దం మాత్రమే ఉంది.
ఒక పాడైన షెడ్యూలర్ను డీబగ్ చేయడానికి నేను గంటల కొద్దీ సమయాన్ని వృధా చేశాను. నేను తప్పు చేశాను. ఛానెల్స్ ఎలా పనిచేస్తాయో నాకు అర్థం కాలేదు.
మీ Go ప్రోగ్రామ్లు హ్యాంగ్ అవ్వకుండా ఉండటానికి ఇక్కడ మూడు నియమాలు ఉన్నాయి.
- Nil ఛానెల్స్ బ్లాక్ హోల్స్ వంటివి ఒక nil ఛానెల్ శాశ్వతంగా బ్లాక్ చేస్తుంది. మీరు ఒక nil ఛానెల్లో డేటాను పంపినా లేదా స్వీకరించినా, ఆ goroutine అక్కడే ఆగిపోతుంది.
- ఎల్లప్పుడూ మీ ఛానెల్స్ను
makeతో ఇనిషియలైజ్ చేయండి. - మీకు నమ్మకం లేకపోతే nil చెక్ ఉపయోగించండి.
- క్లోజింగ్ నియమాలు పానిక్స్ను నివారిస్తాయి ఛానెల్ను క్లోజ్ చేయడం శాశ్వతమైనది.
- కేవలం పంపేవారు (sender) మాత్రమే ఛానెల్ను క్లోజ్ చేయాలి.
- క్లోజ్ చేసిన ఛానెల్కు డేటాను పంపడం వల్ల పానిక్ (panic) సంభవిస్తుంది.
- ఛానెల్ క్లోజ్ అయిందో లేదో తనిఖీ చేయడానికి రెండవ రిటర్న్ వాల్యూని ఉపయోగించండి:
v, ok := <-ch. okఅనేదిfalseఅయితే, ఛానెల్ క్లోజ్ చేయబడింది.
- భద్రత కోసం ఛానెల్ డైరెక్షన్స్ ఉపయోగించండి ఛానెల్ పంపడానికా లేదా స్వీకరించడానికా అనేది పేర్కొనడానికి Go అనుమతిస్తుంది.
chan<- intఅంటే మీరు డేటాను పంపగలరు మాత్రమే.<-chan intఅంటే మీరు డేటాను స్వీకరించగలరు మాత్రమే.- ఇది మీ కోడ్ను రన్ చేసే ముందే తప్పులను గుర్తించడానికి కంపైలర్ను ప్రేరేపిస్తుంది.
క్లీన్ పైప్లైన్ను ఎలా నిర్మించాలి:
- ఛానెల్ ఖచ్చితంగా ఒకేసారి క్లోజ్ అయ్యేలా చూడటానికి
defer closeఉపయోగించండి. - ఛానెల్స్పై లూప్ చేయడానికి
rangeఉపయోగించండి. ఛానెల్ క్లోజ్ అయినప్పుడు ఇది ఆటోమేటిక్గా ఆగిపోతుంది. - కఠినమైన ఒప్పందాలను (strict contracts) సృష్టించడానికి మీ ఫంక్షన్లకు డైరెక్షన్ టైప్స్ను కేటాయించండి.
మీరు ఈ పద్ధతులను అనుసరించినప్పుడు, లీక్లు మరియు పానిక్స్ను నివారిస్తారు. మీరు పరీక్షించడానికి సులభంగా మరియు దృఢంగా ఉండే సిస్టమ్లను నిర్మిస్తారు.
మీ సవాలు:
బహుళ ఇన్పుట్ ఛానెల్స్ను ఒకే అవుట్పుట్ ఛానెల్లోకి విలీనం చేసే ఫంక్షన్ను వ్రాయండి. select లూప్ను ఉపయోగించండి. 500ms టైమ్ అవుట్ను జోడించండి. ఎటువంటి goroutines లీక్ కాకుండా చూసుకోండి.
మీ పరిష్కారాన్ని కామెంట్లలో పోస్ట్ చేయండి.