مهدی خانزادی
۲ تیر ۱۴۰۵
با کانتکست در گولنگ آشنا میشویم و یاد میگیریم چطور از آن استفاده کنیم.
پکیج context در کتابخانه استاندارد Go قرار دارد و اینترفیس Context را ارائه میکند. با استفاده از این اینترفیس میتوان مهلت زمانی (Deadline)، محدودیت زمانی (Timeout) و سیگنال لغو (Cancellation Signal) را برای عملیات مختلف تعریف و مدیریت کرد.
علاوه بر این، context امکان نگهداری و انتقال دادههایی را فراهم میکند که دامنه اعتبار (Scope) و طول عمر آنها به یک درخواست مشخص محدود است. این ویژگی بهویژه در برنامههای تحت وب و سرویسهای توزیعشده کاربرد دارد؛ برای مثال، میتوان اطلاعاتی مانند شناسه کاربر احراز هویتشده، شناسه رهگیری درخواست (Request ID) یا اطلاعات مربوط به تراکنش را از طریق context بین لایههای مختلف برنامه منتقل کرد.
اینترفیس Context دارای ساختار ساده ای مانند زیر است:
برای ایجاد Context میتوان از تابعهای زیر استفاده کرد:
context.Background : یک Context اولیهی خالی ایجاد میکند. معمولا برای شروع از این تابع استفاده میشود و سپس در ادامه میتوان ددلاین (deadline) و کنسلیشن (cancel) را به آن افزود..context.TODO : در حالتی که به یک کانتکست خالی نیاز داریم اما نمیدانیم با Context چه کاری انجام دهیم, میتوانیم از این تابع استفاده کنیم.context.WithCancel : برای کنسلیشن و به صورت کلی ایجاد سیگنال کنسلیشن, میتوان از این تابع استفاده کرد.context.WithTimeout / context.WithDeadline : به ترتیب برای ایجاد سیگنال تایم اوت یا ددلاین میتوان از این تابعها استفاده کرد.context.WithValue : با استفاده از این تابع میتوان یک مقدار را درون کانتکست قرار داد و بعدتر آن را از درون کانتکست با استفاده از تابع Value دریافت کرد.contextبا استفاده از context میتوان سیگنال لغو (Cancellation Signal) را به گوروتینها ارسال کرد تا در صورت نیاز، اجرای خود را متوقف کنند. این قابلیت برای مدیریت عملیات طولانیمدت، آزادسازی منابع و جلوگیری از اجرای غیرضروری پردازشها بسیار مفید است.
در مثال زیر، ابتدا یک Context اولیه با استفاده از context.Background() ایجاد میکنیم. سپس با استفاده از context.WithCancel()، یک Context قابل لغو و یک تابع cancel دریافت میکنیم. با استفاده از time.AfterFunc، تابع cancel پس از یک ثانیه فراخوانی میشود که در نتیجه آن، Context لغو شده و گوروتینهای وابسته به آن از طریق دریافت سیگنال از متوقف میشوند.
ctx.Done()contextDeadline نشاندهنده یک زمان مشخص در آینده است که عملیات باید تا قبل از آن تکمیل شود. اگر عملیات تا آن زمان به پایان نرسد، بهصورت خودکار لغو (cancel) خواهد شد.
در Go میتوان با استفاده از context.WithDeadline برای یک عملیات زمان پایان مشخصی تعیین کرد.
contextTimeout به مدت زمانی گفته میشود که برای انجام یک عملیات در نظر گرفته میشود. اگر عملیات در بازه زمانی تعیینشده کامل نشود، بهصورت خودکار متوقف (cancel) میشود.
در Go میتوان با استفاده از context برای یک عملیات محدودیت زمانی ایجاد کرد.
Context در Go میتوان با استفاده از context.WithValue یک مقدار را داخل Context ذخیره کرد و سپس از طریق متد Value به آن دسترسی پیدا کرد.
اگرچه context از طریق context.WithValue امکان ذخیره و انتقال مقادیر را فراهم میکند، اما طبق توصیه مستندات Go، این قابلیت باید تنها برای دادههای مرتبط با محدوده یک درخواست (request-scoped data) که بین APIها و گوروتینها جابهجا میشوند استفاده شود و نباید بهعنوان جایگزینی برای ارسال پارامترهای معمولی یا نگهداری دادههای اختیاری در توابع مورد استفاده قرار گیرد.
کانتکستها در Go تغییرناپذیر (immutable) هستند. این بدان معناست که هر بار تغییری اعمال میکنیم، یک کانتکست جدید ایجاد میشود که به کانتکست قبلی ارجاع میدهد و آن را بهعنوان والد (parent) خود نگه میدارد.
لغو (cancel) کردن یک کانتکست باعث میشود تمامی کانتکستهای فرزند (descendant) آن نیز لغو شوند، اما کانتکستهای والد (ancestor) تحت تأثیر قرار نمیگیرند و لغو نمیشوند.
هنگامی که متد Value را فراخوانی میکنیم، ابتدا مقدار مورد نظر در کانتکست فعلی جستوجو میشود. اگر مقدار یافت نشود، جستوجو در کانتکست والد ادامه پیدا میکند و این فرایند تا رسیدن به کانتکست ریشه ادامه مییابد.
Context رعایت کنیمcontext.Context را همواره بهعنوان اولین پارامتر به توابعی که به آن نیاز دارند پاس دهید.context.Value برای انتقال دادههای مرتبط با طول عمر یک درخواست (مانند requestID، traceID یا logger) استفاده کنید و از قرار دادن دادههای اصلی بیزینس در آن بپرهیزید.Err() میتوان تشخیص داد که یک کانتکست به دلیل فراخوانی cancel() لغو شده است (context.Canceled) یا به دلیل اتمام مهلت زمانی (context.DeadlineExceeded).قسمت قبل: چنلها (channels) | گولنگ به زبان ساده