بررسی عملکرد Concurrency در زبان Go

چهارشنبه 5 اردیبهشت 1397

زبان Go از دسته زبان های بسیار مشهور و محبوب به شمار می رود. مفهوم همروندی یا Concurrency در زبان Go به طور استاندارد رعایت شده است.

 بررسی عملکرد Concurrency در زبان Go

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

Concurrency در زبان Go چیست؟

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

مبرهن است که در Concurrency موازی انجام شدن برنامه تضمین نمی شود اما ساختار برنامه فیکس و منظم است.

شیوه های Concurrency در زبان Go

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

شاید واژه functionبه گوش ما خورده باشد، functionها در واقع زبان های تابع گرا هستند، این برنامه به صورت ذاتی برنامه نویسی Concurrency را به شما تلقین می کنند. این زبان ها محبوبیت بسیار زیادی دارند. البته زبان های دستوری هم در این راستا تلاش هایی کرده اند و هر یک به صورت غیر مستقیم توانسته اند خاصیت همروندی را فراهم کنند.

مبرهن است که مبنای کار همه پردازش ها در نهایت بر پایه thread ها است اما هنوز هم در سیستم عامل اینگونه پردازش ها سطح پایین محسوب می شود. چنین برنامه هایی در وضعیت Concurrency به سختی پیاده سازی می شود و بهینگی لازم را ندارد.

خصوصیات پیاده سازی زبان Go به صورت Concurrency

تا به اینجای کار یک سری توضیحات داده شد که متوجه شدیم حرکت Concurrency به طور کلی به سمت پیشرفت و راحتی کار است. در نگاهی کلی تر اینطور به نظر می رسد که پیاده سازی Concurrency ساده و آسان است، این روند بهینه و سبک است و همه منظوره بودن یکی از ویژگی های خوب این روند محسوب می شود. زبان Go از برنامه نویسی Concurrency پشتیبانی بسیار قدرتمندی می کند، این زبان به صورت کتابخانه و یا به صورت قابلیت جانبی نیست! زبان Go به صورت درونی از Concurrency پشتیبانی می کند. اگر دقت کرده باشید نگارش مخصوص به این کار در زبان Go وجود دارد که مسیر را بسیار آسانتر می کند.

از آنجایی که برنامه نویسی Concurrency در زبان Go بسیار مهم و ضروری است. طراحان زبان سعی کرده اند که یک قابلیت منحصربفرد را در این زبان جانمایی کنند به این قابلیت goroutines گفته می شود. ویژگی های زبان Go سبب می شود دست برنامه نویس بازتر شود.

عملکرد زبان go با goroutines 

این واژه در واقع بر واحد اجرایی مستقل تاکید دارد. در زبان های برنامه نویسی وقتی یک تابع اجرا می شود اجرای آن تا زمانی که اجرا  کامل انجام نشده و یا مقداری برگشت داده نشده ادامه دار است. goroutines تابعی است که اجرا را در میانه راه متوقف می کند و به نوعی حالت standby آغاز می شود. اگر مجدد به تابع بازگشتی صورت گیرد اجرای تابع از جایی که متوقف شده بود ادامه پیدا می کند. چنین قابلیتی سبب می شود تا برنامه نویس بتواند زمانبندی مناسبی داشته باشد و بین برنامه های خود سوئیچ کند.

به نظر شما رمز این کار کجاست؟ درست حدس زدید! در واقع یک stack سراسری وجود دارد که وضعیت کلی برنامه را نگه داری می کند. برای هر goroutines یک stack جداگانه ساخته می شود به این ترتیب نگهداری وضعیت فعلی و سوئیچ کردن بسیار آسانتر می شود. این قابلیت همچون یک thread عمل می کند وقتی که سیستم عامل از یک thread به thread دیگر می رود حالت thread قبلی ثبت شده و در هنگام بازگشت از نقطه قبلی شروع به کار می کند. یادگیری زبان Go بسیار آسان است.

فرق goroutines و thread در زبان Go

به هر حال این دو گزینه جدای از هم فعالیت دارند و قطعاً یک سری فرق ها در بین آنها دیده می شود، به طور کلی thread ها عمل زمانبندی و سوئیچ کردن را به صورت اتوماتیک و از طریق سیستم عامل انجام می دهند. خاصیت پخش شدن بر روی هسته های مختلف دارند و لایه کاری سیستم عامل اجرا می شوند.

Goroutines باید توسط خود برنامه نویس به صورت دستی زمانبندی شود و لایه خود زبان برنامه نویسی اجرا و مدیریت می شوند. زبان Go از دسته زبان های مشهور در دنیا به شمار می رود.

در صورت تمایل میتوانید از دوره آموزش Concurrency در زبان Go دیدن کنید .

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

تاکنون هیچ کاربری از این پست تشکر نکرده است

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید