𝗖𝗵𝗮𝗻𝗻𝗲𝗹𝘀 மூலம் 𝗚𝗼 𝗖𝗼𝗻𝗰𝘂𝗿𝗿𝗲𝗻𝗰𝘆-யில் தேர்ச்சி பெறுங்கள்
நான் ஒருமுறை Go-வில் ஒரு image processing pipeline-ஐ உருவாக்கினேன்.
ஒவ்வொரு படிநிலைக்கும் நான் goroutines-களைப் பயன்படுத்தினேன். அவற்றை channels மூலம் இணைத்தேன். 'run' செய்தேன்.
நிரல் (program) உறைந்து போனது. Memory பயன்பாடு அதிகரித்தது. பிறகு அது செயலிழந்தது. எந்தப் பிழைகளும் (errors) வரவில்லை. அமைதி மட்டுமே நிலவியது.
ஒரு பழுதான scheduler-ஐச் சரிசெய்ய (debug) பல மணிநேரங்களை வீணடித்தேன். நான் தவறு செய்தேன். channels எவ்வாறு செயல்படுகின்றன என்பதை நான் சரியாகப் புரிந்துகொள்ளவில்லை.
உங்கள் Go நிரல்கள் முடங்குவதைத் தவிர்க்க இதோ மூன்று விதிகள்.
- Nil channels கருந்துளைகள் போன்றவை ஒரு nil channel எப்போதும் முடக்கிவிடும் (blocks). நீங்கள் ஒரு nil channel-இல் தரவை அனுப்பினால் அல்லது பெற முயன்றால், அந்த goroutine அப்படியே சிக்கிக்கொள்ளும்.
- எப்போதும் உங்கள் channels-களை
makeமூலம் தொடங்குங்கள் (initialize). - உங்களுக்குத் தெரியவில்லை என்றால் nil check-ஐப் பயன்படுத்துங்கள்.
- Closing விதிகள் panics-ஐத் தவிர்க்கும் ஒரு channel-ஐ மூடுவது (closing) நிரந்தரமானது.
- தரவை அனுப்புபவர் (sender) மட்டுமே ஒரு channel-ஐ மூட வேண்டும்.
- மூடப்பட்ட ஒரு channel-க்குத் தரவை அனுப்பினால் panic ஏற்படும்.
- ஒரு channel மூடப்பட்டிருக்கிறதா என்பதைச் சரிபார்க்க இரண்டாவது return value-வைப் பயன்படுத்துங்கள்:
v, ok := <-ch. okஎன்பதுfalseஎன இருந்தால், அந்த channel மூடப்பட்டுவிட்டது என்று அர்த்தம்.
- பாதுகாப்பிற்காக channel directions-களைப் பயன்படுத்துங்கள் ஒரு channel தரவை அனுப்பப் பயன்படுகிறதா அல்லது பெறப் பயன்படுகிறதா என்பதைத் தீர்மானிக்க Go அனுமதிக்கிறது.
chan<- intஎன்பது நீங்கள் தரவை அனுப்ப மட்டுமே முடியும் என்பதைக் குறிக்கிறது.<-chan intஎன்பது நீங்கள் தரவை பெற மட்டுமே முடியும் என்பதைக் குறிக்கிறது.- இது உங்கள் நிரலை இயக்குவதற்கு முன்பே பிழைகளைக் கண்டறிய compiler-ஐத் தூண்டுகிறது.
ஒரு தெளிவான pipeline-ஐ உருவாக்குவது எப்படி:
- ஒரு channel சரியாக ஒருமுறை மட்டுமே மூடப்படுவதை உறுதி செய்ய
defer close-ஐப் பயன்படுத்துங்கள். - channels-களை லூப் (loop) செய்ய
range-ஐப் பயன்படுத்துங்கள். இது channel மூடப்படும்போது தானாகவே நின்றுவிடும். - கடுமையான ஒப்பந்தங்களை (strict contracts) உருவாக்க உங்கள் functions-களுக்கு direction types-களை ஒதுக்குங்கள்.
இந்த முறைகளைப் பின்பற்றும்போது, leaks மற்றும் panics-களைத் தவிர்க்கலாம். எளிதாகச் சோதனை செய்யக்கூடிய மற்றும் வலுவான (robust) அமைப்புகளை நீங்கள் உருவாக்க முடியும்.
உங்கள் சவால்:
பல input channels-களை ஒரே output channel-ஆக இணைக்கும் ஒரு function-ஐ எழுதுங்கள். select loop-ஐப் பயன்படுத்துங்கள். 500ms timeout-ஐச் சேர்க்கவும். எந்த goroutine-களும் leak ஆகாமல் இருப்பதை உறுதி செய்யவும்.
உங்கள் தீர்வைக் கருத்துப் பகுதியில் (comments) பதிவிடுங்கள்.