ചാനലുകളിലൂടെ Go Concurrency-യിൽ പ്രാവീണ്യം നേടുക

ഞാൻ ഒരിക്കൽ Go-യിൽ ഒരു ഇമേജ് പ്രോസസ്സിംഗ് പൈപ്പ്‌ലൈൻ നിർമ്മിച്ചിരുന്നു.

ഓരോ ഘട്ടത്തിനും ഞാൻ goroutines ഉപയോഗിച്ചു. അവയെ ചാനലുകൾ (channels) ഉപയോഗിച്ച് ബന്ധിപ്പിച്ചു. ഞാൻ റൺ ചെയ്തു.

പ്രോഗ്രാം ഫ്രീസ് ആയി. മെമ്മറി ഉപയോഗം വർദ്ധിച്ചു. പിന്നീട് അത് നിലച്ചുപോയി. ഒരു എററും (error) വന്നില്ല. നിശബ്ദത മാത്രം.

ഒരു തകരാറിലായ ഷെഡ്യൂളർ (scheduler) ഡിബഗ് ചെയ്യാൻ ഞാൻ മണിക്കൂറുകൾ പാഴാക്കി. ഞാൻ തെറ്റാണ് ചെയ്തത്. ചാനലുകൾ എങ്ങനെയാണ് പ്രവർത്തിക്കുന്നതെന്ന് എനിക്ക് മനസ്സിലായില്ല.

നിങ്ങളുടെ Go പ്രോഗ്രാമുകൾ ഹാങ്ങ് ആകാതിരിക്കാൻ മൂന്ന് നിയമങ്ങൾ ഇതാ.

  1. Nil ചാനലുകൾ ബ്ലാക്ക് ഹോളുകളാണ് ഒരു nil ചാനൽ എന്നെന്നേക്കുമായി ബ്ലോക്ക് ചെയ്യും. ഒരു nil ചാനലിൽ നിങ്ങൾ ഡാറ്റ അയക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്താൽ, ആ goroutine കുടുങ്ങിപ്പോകും.
  1. ക്ലോസിംഗ് നിയമങ്ങൾ പാണിക്സ് (panics) ഒഴിവാക്കുന്നു ഒരു ചാനൽ ക്ലോസ് ചെയ്യുന്നത് ശാശ്വതമാണ്.
  1. സുരക്ഷയ്ക്കായി ചാനൽ ദിശകൾ (channel directions) ഉപയോഗിക്കുക ഒരു ചാനൽ ഡാറ്റ അയക്കാനാണോ അതോ സ്വീകരിക്കാനാണോ എന്ന് നിശ്ചയിക്കാൻ Go നിങ്ങളെ അനുവദിക്കുന്നു.

എങ്ങനെ ഒരു ക്ലീൻ പൈപ്പ്‌ലൈൻ നിർമ്മിക്കാം:

ഈ രീതികൾ പിന്തുടരുമ്പോൾ, നിങ്ങൾക്ക് മെമ്മറി ലീക്കുകളും (leaks) പാണിക്സും ഒഴിവാക്കാം. പരിശോധിക്കാൻ എളുപ്പമുള്ളതും കരുത്തുറ്റതുമായ സിസ്റ്റങ്ങൾ നിങ്ങൾക്ക് നിർമ്മിക്കാം.

നിങ്ങളുടെ വെല്ലുവിളി: ഒന്നിലധികം ഇൻപുട്ട് ചാനലുകളെ ഒരു ഔട്ട്‌പുട്ട് ചാനലിലേക്ക് ലയിപ്പിക്കുന്ന (merge) ഒരു ഫംഗ്ഷൻ എഴുതുക. ഒരു select ലൂപ്പ് ഉപയോഗിക്കുക. 500ms ടൈമൗട്ട് (timeout) ചേർക്കുക. ഒരു goroutine പോലും ലീക്ക് (leak) ആകുന്നില്ലെന്ന് ഉറപ്പാക്കുക.

നിങ്ങളുടെ പരിഹാരം കമന്റുകളിൽ പോസ്റ്റ് ചെയ്യുക.

സ്രോതസ്സ്: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79