کاربردهای Context in Go

10/25/2024 Go(golang)
48

در بسیاری از مطالب مربوط به Golang بر استفاده از  context و توانایی های آن مطالب زیادی گفته اند، انچه اینجا یاداشت میکنم برگرفته از یک فیلم اموزشی بر باره context در Golang است که برای اموزش خودم اینجا دوباره نویسی میکنم شاید به کار شما ها هم بیاد

 

context Pakage از پکیجهای درون برنامه ای Go هست به این معنی که نیاز نیست ان را به پروژه اضافه نماید

عموما برای کمک به مدیریت درخواستها و تنظیم deadline برای درخواستها در نظر گرفته شده است

هر Context دو چیز را به صورت عمومی مدیریت میکند Deadlin ها و کنسل کردن یک Operation که در goroutin ها در حال اجراست 

به این معنی که با استفاده از Context میتوانید مطمئن شوید برنامه نشتی ندارد(در این مورد برنامه نویسیان حرفه ای بیشتر از من میدانند که نشتی میتواند برنامه در مقیاسهای بزرگ را عملا غیر قابل استفاده کند  ) 

همینطور Context مبتواند اتصال به پایگاه داده ها را بهتر مدیریت کنید و یا درخواستهای شبکه را هندل نماید تا در زمان مناسب پایان دهد.

برای هر Contect package    چهار کلمه کلیدی وجود دارد :

  1. Context Type: که در بر دارنده اطلاعات میان goroutin و function است ، میتواند در بر دارنده زمان پایان فانکشن و یا فرمان کنسل کردن فانکشن باشد و یا مقدادیر بین تابع و گوروتین را د رخود حمل کند.
  2. Context with Deadline: به شما امکان میدهد یک زمان Deadline برای عملکرد تعریف شده تنظیم کنید 
  3. Context With timeout: به شما این امکان را میدهد تا زمان  timeout   برای تابع خود تعریف کنید و این امکان را میدهد تا زمان تابع را مدیریت کنید
  4. Contect With value: این امکان را به شما میدهد تا اطلاعات مورد نیاز بیشتری را به Context خود اضافه کنید با استفاده از Key تعریف شده ان را بازیابی کنید.

 

در نظر داشته باشید به کارگرفته Stack (پشته) در گوروتین ها در زمان استفاده از Context  بسیار مهم است 

میتوانید Context را به عنوان یه پارامتر و یا ارگومان استفاده کنید

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

کاربرد ارسال اطلاعات با Context میتوان ارسال اطلاعات توکن احراز  هویت و یا آی دی درخواست باشد (Authentication Token  AND Request IDs) در یک برنامه چند لایه است.

 

پس تا اینحا فواید استفاده از Context استفاده آسان از ان و انعطاف پذیری و ایمینی در همزمانی  میتوان نام برد.

همانطو رکه گفتیم برای میتوان یک سری اطلاعات را به Context اضافه نمود تا در جاهای دیگر برنامه از آن استفاده کرد. برای تعریف اطلاعات در Context:

ctx := Context.WithValue(parentContext,Key, Value)

برای دسترسی به اطلاعات داخل Context

val := ctx.Value(key)

 

Context Function ها به شما اجازه  میدهند 

1- طول عمر و یا کنسل کردن یه عملیات را مدیریت کنید 

2- میتوانید یک Context جدید با عمکرد های جدید ایجاد کنید

   در همین راستا به یاد داشته باشید Context Function با WithCancel میتوانید یک کانتکس جدید با همراهی Cancel Function برگرداند 

  ویا WithTimeout  میتواند یک Context جدید برگرداند با همراهی یک زمان برای لغو عملکرد تعریف شده.

 

ctx, cancel:= context.WithCancel(Context.Background())
defer cancel()

go func(){
	//opereation goes here
	cancel()
}()

 

ctx, cancel:= context.WithTimeout(Context.Background(),
time.Duration(time.Milliesecond*100))
defer cancel()

req= req.WithContext(ctx)

 

دو متد برای مدیریت Context درایم 

1- Deadline که به شما این امکان را میدهد Deadline را در Context بازیابی کنید

2- Done زمانی که Context به پایان رسیده یا کنسل شده است که یک کانال به شما برمیگرداند