به دنبال علم
نکات مهم Concurrency در Golang
با سلام من علیرضا فرجی هستم و دراین مقاله قرار درمورد Concurrency صحبت کنیم و همین اول بگم که قرار نیست که در مورد خود Concurrency صحبت کنیم چون مطالب خیلی زیادی همین الانش برای شما در سایت های مختلف وجود دارد و هدف این مقاله در مورد نکات مهمی که هنگام کار با Concurrency باید بدونید هستش ولی اگر بخواهیم با یک مثال کوچک مفهوم Concurrency براتون توضیح بدم دقیقا مانند نوشیدن چایی هنگام فیلم دیدن که ما برای نوشیدن چایی فیلم متوقف نمیکنیم و بلکه هنگام دیدن میتونیم بنوشیم
حال بپردازیم به نکات مهم
اولین نکته مهم در این بحث ،race condition هست. race condition یعنی زمانی که بخواهیم توسط دو یا چند Goroutine به یک متغییر یا هرچیزی که به حافظه وصله ،دسترسی داشته باشیم یا تغییری روش اعمال کنیم و در این حالت امکان داره تداخل به وجود بیاد و نتیجه ای که میخوایم نگریم و حتی Goroutine leak به وجود بیاد که در ادامه در موردش صحبت خواهیم کرد
برای جلوگیری از راه های زیادی وجود داره که اولین آن استفاده از 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
مطلبی دیگر از این انتشارات
۵ اشتباه رایج برنامهنویسان تازهکار (و چگونه از آنها اجتناب کنیم)
مطلبی دیگر از این انتشارات
بهترین framework ها و library های زبان Golang
مطلبی دیگر از این انتشارات
پیاده سازی بازی زندگی (Game of Life) با جاوااسکریپت