نکات مهم Concurrency در Golang

با سلام من علیرضا فرجی هستم و دراین مقاله قرار درمورد Concurrency صحبت کنیم و همین اول بگم که قرار نیست که در مورد خود Concurrency صحبت کنیم چون مطالب خیلی زیادی همین الانش برای شما در سایت های مختلف وجود دارد و هدف این مقاله در مورد نکات مهمی که هنگام کار با Concurrency باید بدونید هستش ولی اگر بخواهیم با یک مثال کوچک مفهوم Concurrency براتون توضیح بدم دقیقا مانند نوشیدن چایی هنگام فیلم دیدن که ما برای نوشیدن چایی فیلم متوقف نمیکنیم و بلکه هنگام دیدن میتونیم بنوشیم

حال بپردازیم به نکات مهم

اولین نکته مهم در این بحث ،race condition هست. race condition یعنی زمانی که بخواهیم توسط دو یا چند Goroutine به یک متغییر یا هرچیزی که به حافظه وصله ،دسترسی داشته باشیم یا تغییری روش اعمال کنیم و در این حالت امکان داره تداخل به وجود بیاد و نتیجه ای که میخوایم نگریم و حتی Goroutine leak به وجود بیاد که در ادامه در موردش صحبت خواهیم کرد

مثالی از race condition
مثالی از race condition


برای جلوگیری از راه های زیادی وجود داره که اولین آن استفاده از mutex که با استفاده از آن میتوانیم حافظه قفل کنیم و پس تموم شدن کارمون حاظه رو باز کنیم ،لطفا به مثال زیر توجه کنید

حل کردن مشکل race condition یا استفاده از mutex
حل کردن مشکل race condition یا استفاده از mutex


راه دوم استفاده از Channels. کانال ها (Channels) یکی از ویژگی های قدرتمند زبان Go هستند که برای ارتباط و همگام سازی بین Goroutines استفاده می شوند. کانال ها یک نوع ارتباط مبتنی بر پیام را ارائه می دهند که به Goroutines اجازه می دهد پیام ها را ارسال و دریافت کنند. این پیام ها می توانند انواع داده های مختلف باشند، از جمله اعداد صحیح، رشته ها و ساختارها.

به هنگام استفاده از Channels پیشنهاد میشود از select نیز استفاده شود. select یک ویژگی دیگر زبان Go است که به Goroutines اجازه می دهد تا همزمان منتظر وقوع چندین رویداد باشند. این امکان را به Goroutines می دهد تا واکنش سریع تری به رویدادها نشان دهند و از شرایط مسابقه جلوگیری کنند.

نشت (Goroutine (leak چیست؟

یک Goroutine leak زمانی رخ می دهد که یک Goroutine به طور نامحدود اجرا شود، حتی زمانی که دیگر نیازی به آن نیست. این می تواند منجر به افزایش مصرف حافظه و سرانجام باعث خرابی برنامه شود.

چرا Goroutine leak رخ می دهد؟

رایج ترین دلیل Goroutine leak این است که یک Goroutine فراموش می کند که کار خود را تمام کرده است. این می تواند به دلیل یک خطای منطقی یا به دلیل اینکه Goroutine به طور ناگهانی توسط یک سیگنال لغو شده است، رخ دهد.

چگونه Goroutine leak را تشخیص دهیم؟

می توانید از ابزارهایی مانند runtime.NumGoroutine() برای ردیابی تعداد Goroutine های در حال اجرا استفاده کنید. اگر تعداد Goroutine ها به طور مداوم در حال افزایش است، ممکن است یک leak وجود داشته باشد. همچنین می توانید از ابزارهای پروفایل مانند pprof برای شناسایی Goroutine هایی که به طور نامناسبی اجرا می شوند استفاده کنید.

چگونه Goroutine leak را برطرف کنیم؟

برای رفع Goroutine leak، باید Goroutine ای را که در حال leak است شناسایی کنید و مطمئن شوید که به درستی پایان می یابد. این ممکن است شامل اضافه کردن یک تماس defer wg.Done() به تابع Goroutine یا استفاده از یک مکانیسم همگام سازی مانند sync.Mutex باشد.

استفاده موردی Goroutine leak در Concurrency

نشت (Goroutine (leak می تواند به طور خاص در برنامه های همزمان مشکل ساز باشد، زیرا Goroutine های زیادی می توانند به سرعت ایجاد شوند و اگر به درستی مدیریت نشوند، می توانند منجر به مصرف حافظه بیش از حد شوند.

ممنون که تا اینجا این مقاله رو خوندید و حتما پیشنهاد میکنم باری بهتر یادگرفتن این بحث این course را در یوتوب نگاه کنید و تمرین کنید. لینک course