رشته ها در Go
در این بخش به بررسی رشته ها در Go می پردازیم، زبان Go، که به نام گو (Go) یا گولنگ (Golang) شناخته میشود، یک زبان برنامهنویسی توسعه یافته توسط گوگل است که برای ساخت نرمافزارهای مقیاسپذیر و توزیعشده طراحی شده است. یکی از ویژگیهای برجسته و کارآمد Go، مدیریت همزمانی است که از طریق ساختارهایی مانند گوروتینها (goroutines) و کانالها (channels) امکانپذیر میشود. اما در کنار این قابلیتها، مفهوم رشتهها یا همان threads در Go نیز اهمیت خاصی دارد. در این مقاله قصد داریم به بررسی رشتهها در Go پرداخته و نحوه استفاده از آنها در برنامهنویسی این زبان را آموزش دهیم.
رشتهها در Go به عنوان واحدهای اجرایی مستقل که میتوانند به صورت همزمان (concurrent) اجرا شوند، شناخته میشوند. این ویژگی به برنامهنویسان این امکان را میدهد که چندین کار را به صورت همزمان و بدون نیاز به استفاده از متدهای پیچیده مدیریت همزمانی انجام دهند. تفاوتهای عمدهای بین رشتهها در Go و زبانهایی مانند جاوا یا سی وجود دارد که فهم آنها میتواند به بهینهسازی عملکرد برنامهها کمک کند. در ادامه، با معرفی دقیقتر رشتهها در Go و روشهای استفاده از آنها آشنا خواهیم شد.
رشتهها در Go چیست؟
در زبانهای برنامهنویسی سنتی مانند C و Java، رشتهها به عنوان واحدهای پردازشی اصلی هستند که هرکدام به صورت جداگانه در سیستم عامل به اجرا درمیآیند. اما در Go، مدیریت و استفاده از رشتهها به روشی سادهتر و بهینهتر انجام میشود. در واقع، Go برای مدیریت همزمانی به جای استفاده از سیستمهای پیچیدهتری مانند pthreads در C، از گوروتینها استفاده میکند.
گوروتینها مشابه به رشتهها هستند، اما با این تفاوت که بسیار سبکتر و کارآمدتر عمل میکنند. در Go، هر گوروتین به یک زیررشته یا thread اشاره ندارد. بلکه، آنها توسط مدیریت زمانبندی Go به صورت مستقل و همزمان اجرا میشوند، بدون اینکه نیاز به مدیریت پیچیدهای از سمت برنامهنویس باشد.
استفاده از گوروتینها در Go
در زبان Go، برای استفاده از گوروتینها تنها کافی است که از دستور go
قبل از فراخوانی یک تابع استفاده کنیم. این دستور باعث میشود که آن تابع به صورت همزمان اجرا شود. برای مثال:
در این کد، هنگامی که go printMessage()
اجرا میشود، این تابع به صورت همزمان در کنار ادامهی اجرای برنامه در main()
به اجرا درمیآید. به این ترتیب، خروجی به صورت غیرقابل پیشبینی خواهد بود، زیرا هر کدام از گوروتینها ممکن است در هر لحظه اجرا شوند.
ویژگیهای گوروتینها در Go
گوروتینها ویژگیهای خاص خود را دارند که آنها را از رشتهها در سایر زبانها متمایز میکند:
- سبک بودن: گوروتینها بسیار کمهزینهتر از رشتهها هستند. در واقع، هر گوروتین فقط چند کیلوبایت حافظه مصرف میکند.
- زمانبندی خودکار: Go از یک زمانبند داخلی برای مدیریت گوروتینها استفاده میکند. این زمانبند به طور خودکار گوروتینها را به طور بهینه توزیع میکند تا بهرهوری سیستم به حداکثر برسد.
- اجرا در فضای مشترک: گوروتینها میتوانند به راحتی با یکدیگر در حافظه مشترک ارتباط برقرار کنند.
مدیریت همزمانی با استفاده از کانالها
در کنار گوروتینها، Go از یک ساختار دادهای به نام کانال (Channel) استفاده میکند که امکان ارتباط بین گوروتینها را فراهم میآورد. کانالها مانند صفها عمل میکنند و میتوانند دادهها را از یک گوروتین به گوروتینی دیگر منتقل کنند. این ویژگی به برنامهنویسان کمک میکند تا دادهها را بدون نیاز به استفاده از قفلها و مکانیزمهای پیچیده همزمانی، بین گوروتینها منتقل کنند.
ایجاد و استفاده از کانالها
در Go میتوان کانالها را با استفاده از دستور make
ایجاد کرد. پس از آن، دادهها میتوانند از طریق کانالها ارسال و دریافت شوند:
در این کد، گوروتین sendData
یک پیغام را به کانال ارسال میکند و در ادامه، برنامه در main()
آن پیغام را دریافت کرده و چاپ میکند.
انواع کانالها
در Go میتوان از چند نوع کانال استفاده کرد:
- کانالهای ساده: به طور پیشفرض دادهها از کانالها به صورت بلوکشده (blocking) ارسال و دریافت میشوند.
- کانالهای بدون بلوک: برای ایجاد کانالهایی که بدون انتظار برای دریافت داده کار میکنند، از دستور
select
استفاده میشود. - کانالهای بسته: هنگامی که تمام دادهها ارسال شدند، میتوان کانال را بست تا از استفادههای اشتباه جلوگیری شود.
کنترل همزمانی با select
در Go، برای مدیریت همزمانی پیچیدهتر از دستور select
استفاده میشود. این دستور به برنامهنویس این امکان را میدهد که روی چندین کانال به طور همزمان نظارت کند و بسته به وضعیت کانالها، تصمیمات مختلفی اتخاذ کند.
در این مثال، select
تصمیم میگیرد که کدام پیام از دو کانال را دریافت کند و آن را چاپ میکند.
در این مقاله، با مفاهیم مختلف رشتهها و گوروتینها در Go آشنا شدیم و یاد گرفتیم چگونه میتوانیم از این ویژگیهای قدرتمند زبان Go برای مدیریت همزمانی در برنامههای خود استفاده کنیم. گوروتینها و کانالها دو ابزار کلیدی برای ساخت برنامههای مقیاسپذیر و همزمان در Go هستند که با طراحی ساده و کارآمد خود به یکی از ویژگیهای محبوب این زبان تبدیل شدهاند.
با استفاده صحیح از گوروتینها و کانالها، میتوانیم برنامههایی بنویسیم که به طور مؤثر و کارآمد از منابع سیستم استفاده کنند و در عین حال از پیچیدگیهای معمول در برنامهنویسی همزمانی اجتناب کنیم.
آیا این مطلب برای شما مفید بود ؟