Go-তে Context API ব্যবহার করে Goroutine Management
Go তে Context API একটি শক্তিশালী টুল যা goroutines (যেমন concurrency এবং parallelism) পরিচালনা করতে এবং পরিচালিত goroutines-এর জন্য timeout, cancelation, এবং deadlines সেট করতে সাহায্য করে। এটি একটি goroutine এর lifecycle পরিচালনার জন্য একটি উপযুক্ত পদ্ধতি সরবরাহ করে, বিশেষত যখন একাধিক goroutines সমান্তরালে কাজ করছে এবং আমরা তাদের কার্যক্রম একত্রে নিয়ন্ত্রণ করতে চাই।
Go তে Context API ব্যবহার করে আপনি goroutines কে কিভাবে cancel, timeout, অথবা deadline পরিচালনা করবেন, তা দেখার জন্য নিচের উদাহরণটি দেখুন।
১. Context API কী?
Go তে context প্যাকেজটি goroutines এর মধ্যে একযোগে পরিচালনা এবং তাদের মধ্যে তথ্য (যেমন cancellation signals) ভাগ করার জন্য ব্যবহৃত হয়। Context বিভিন্ন ক্রিয়াকলাপকে একত্রে নিয়ন্ত্রণ এবং টাইমআউট বা ক্যান্সেলেশনের সিগন্যাল পাঠাতে সাহায্য করে।
- Cancellation: কোনও goroutine রোধ বা বন্ধ করার জন্য।
- Timeout: নির্দিষ্ট সময়ের মধ্যে goroutine সম্পন্ন না হলে তা শেষ করতে।
- Deadline: নির্দিষ্ট সময়ের মধ্যে একটি কাজ সম্পন্ন করতে।
- Passing Request-scoped values: Context এর মাধ্যমে goroutines এর মধ্যে ভ্যালু শেয়ার করা যেতে পারে।
২. Context API এর মূল ফাংশন
context.Background(): একটি শিকড় context যা সাধারণত প্রধান goroutine বা প্রোগ্রামের জন্য ব্যবহার করা হয়।context.TODO(): যখন আপনি context নির্ধারণ করতে চান কিন্তু ভবিষ্যতে সেটি সম্পূর্ণ করবেন, এটি ব্যবহার করা হয়।context.WithCancel(): একটি নতুন context তৈরি করে যা cancelable এবং এর cancel function এর মাধ্যমে goroutine বন্ধ করা যায়।context.WithTimeout(): একটি context তৈরি করে যা একটি নির্দিষ্ট সময় পর automatically cancel হয়ে যাবে।context.WithDeadline(): একটি নির্দিষ্ট সময়ের মধ্যে context কে শেষ করার জন্য।context.Value(): একটি context এর মধ্যে কিছু ভ্যালু ধারণ করতে এবং শেয়ার করতে ব্যবহৃত হয়।
৩. Context API দিয়ে Goroutine Management
ধরা যাক, আপনি একটি goroutine চালাতে চান যা কিছু কাজ করবে এবং পরে সেই goroutine-কে cancel বা timeout করতে চান।
৩.১ Context এবং Goroutine Management উদাহরণ
package main
import (
"context"
"fmt"
"time"
)
func processTask(ctx context.Context) {
// Goroutine চলমান থাকাকালীন context থেকে cancellation চেক করা
for {
select {
case <-ctx.Done(): // যদি context.cancel() বা timeout হয়
fmt.Println("Task canceled:", ctx.Err())
return
default:
// কাজের লজিক এখানে থাকবে
fmt.Println("Processing task...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
// ৫ সেকেন্ডে timeout সহ context তৈরি
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Goroutine শুরু করা
go processTask(ctx)
// মূল থ্রেড কিছু সময় চলবে, পরে context ক্যান্সেল করা হবে
time.Sleep(6 * time.Second) // ৬ সেকেন্ডের পর goroutine বন্ধ হবে
fmt.Println("Main function exiting")
}এখানে:
context.WithTimeout(): এটি একটি context তৈরি করে, যার মধ্যে ৫ সেকেন্ড পর স্বয়ংক্রিয়ভাবে cancellation হবে।select: Goroutine-এselectব্লকের মাধ্যমে এটিctx.Done()চেক করে, যদি cancellation ঘটে তাহলে goroutine বন্ধ হয়ে যাবে।time.Sleep(6 * time.Second): আমরা এখানে মূল থ্রেডকে ৬ সেকেন্ডের জন্য বিরতি দিচ্ছি, যাতে goroutine এর কাজ শেষ হয়ে গিয়ে cancellation ঘটে।
আউটপুট:
Processing task...
Processing task...
Processing task...
Task canceled: context deadline exceeded
Main function exitingএখানে, ৫ সেকেন্ডের পর টাইমআউট ঘটলে, goroutine তার কাজ শেষ না করেই বন্ধ হয়ে যায় এবং cancellation বার্তা দেখায়।
৪. context.WithCancel() ব্যবহার করা
আপনি context.WithCancel() ব্যবহার করে নির্দিষ্ট সময়ে বা কোনো শর্তে একটি goroutine কে বন্ধ করতে পারেন।
৪.১ Context with Cancel Example
package main
import (
"context"
"fmt"
"time"
)
func processTask(ctx context.Context) {
for {
select {
case <-ctx.Done(): // cancellation সিগন্যাল গ্রহণ
fmt.Println("Task canceled:", ctx.Err())
return
default:
// কাজের লজিক
fmt.Println("Processing task...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
// ক্যান্সেল করার জন্য context তৈরি
ctx, cancel := context.WithCancel(context.Background())
// Goroutine শুরু করা
go processTask(ctx)
// ৩ সেকেন্ড পর cancel() কল করা হবে
time.Sleep(3 * time.Second)
cancel() // goroutine এর কার্যক্রম বন্ধ করা
fmt.Println("Main function exiting")
}এখানে:
context.WithCancel(): এটি একটি cancelable context তৈরি করে।cancel():cancel()কল করলে ঐ context সম্পর্কিত সমস্ত goroutine বন্ধ হয়ে যাবে।
আউটপুট:
Processing task...
Processing task...
Processing task...
Task canceled: context canceled
Main function exitingএখানে, ৩ সেকেন্ড পরে cancel() ফাংশন কল করার মাধ্যমে গোরাউটিনটি বন্ধ হয়ে যায়।
৫. Deadline সহ Context ব্যবহারের উদাহরণ
context.WithDeadline() ব্যবহার করে আপনি একটি নির্দিষ্ট সময়ের মধ্যে goroutine সম্পন্ন করার জন্য সেট করতে পারেন।
৫.১ Context with Deadline Example
package main
import (
"context"
"fmt"
"time"
)
func processTask(ctx context.Context) {
for {
select {
case <-ctx.Done(): // deadline বা cancellation
fmt.Println("Task canceled:", ctx.Err())
return
default:
// কাজের লজিক
fmt.Println("Processing task...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
// deadline সহ context তৈরি (5 সেকেন্ড)
deadline := time.Now().Add(5 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
// Goroutine শুরু করা
go processTask(ctx)
// মূল থ্রেড কিছু সময় চলবে
time.Sleep(6 * time.Second)
fmt.Println("Main function exiting")
}এখানে:
context.WithDeadline(): এটি একটি context তৈরি করে যার একটি নির্দিষ্ট সময়সীমা (deadline) থাকে। যেহেতু এখানে ৫ সেকেন্ডের deadline সেট করা হয়েছে, তাই ৫ সেকেন্ড পর goroutine স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
আউটপুট:
Processing task...
Processing task...
Processing task...
Task canceled: context deadline exceeded
Main function exitingএখানে, ৫ সেকেন্ডের পর টাইমআউট ঘটলে, goroutine তার কাজ শেষ না করেই বন্ধ হয়ে যায় এবং cancellation বার্তা দেখায়।
সারসংক্ষেপ
context.Background(): মূল context যা সাধারণত প্রোগ্রামের root context হিসেবে ব্যবহার করা হয়।context.TODO(): যখন আপনার context প্রয়োজন হয় কিন্তু আপনি এটি তৈরি করতে চান পরে।context.WithCancel(): একটি cancelable context তৈরি করতে ব্যবহার হয়, যেটি পরেcancel()কল করে বন্ধ করা যায়।context.WithTimeout(): একটি context তৈরি করে যা একটি নির্দিষ্ট সময় পরে সময়সীমা (timeout) চেক করে এবং cancel হয়ে যায়।context.WithDeadline(): একটি context তৈরি করে যা নির্দিষ্ট সময়সীমার মধ্যে শেষ হয়ে যায় (deadline)।
Go Context API ব্যবহার করে goroutines পরিচালনা করা খুবই কার্যকরী, বিশেষত যখন আপনি একাধিক goroutines চালাচ্ছেন এবং তাদের কার্যক্রমকে নিয়ন্ত্রণ করতে চান, যেমন cancellation, timeout, বা deadline এর মাধ্যমে।
Read more