Go-তে Goroutines তৈরি এবং পরিচালনা
Goroutines হল Go ভাষার একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা concurrency (একই সময়ে একাধিক কাজ করার ক্ষমতা) প্রদান করে। গোরাউটিন হল Go ভাষার একটি থ্রেড-হালকা সমান্তরাল একক কার্যক্রম (lightweight concurrent unit of execution), যা ডেভেলপারদের সহজে কনকারেন্ট প্রোগ্রামিং করতে সহায়তা করে। এটি আপনাকে একাধিক কাজ একসঙ্গে চালানোর সুযোগ দেয় এবং সিস্টেমের প্রোসেসিং ক্ষমতাকে পুরোপুরি ব্যবহার করতে সাহায্য করে।
Go তে goroutine খুবই হালকা এবং দ্রুত কার্যকরী, যেহেতু সেগুলি স্বয়ংক্রিয়ভাবে সিস্টেমের থ্রেডগুলোর সাথে ম্যানেজ করা হয়। এটি ব্যবহারে খুব কম মেমরি ব্যবহার হয় এবং একাধিক গোরাউটিন সহজেই একসাথে রান করা সম্ভব।
১. Goroutines কি?
Goroutines হল lightweight threads যা সিপিইউ-এ থ্রেড স্পেস শেয়ার করে। এগুলি খুব দ্রুত এবং সহজভাবে চালানো যায়। Go তে গোরাউটিন তৈরি করতে, go কিওয়ার্ড ব্যবহার করা হয়।
১.১ Goroutine তৈরি করা
Go-তে একটি গোরাউটিন তৈরি করার জন্য go কিওয়ার্ড ব্যবহার করা হয়:
package main
import "fmt"
func printMessage() {
fmt.Println("Hello from Goroutine!")
}
func main() {
// Goroutine তৈরি করা
go printMessage()
// main ফাংশনে আরও কিছু কাজ করা
fmt.Println("Hello from main function!")
// কিছু সময় অপেক্ষা করা
fmt.Scanln() // ইন্টারেকটিভ ইনপুটের জন্য, যাতে গোরাউটিন সম্পন্ন হওয়ার আগে প্রোগ্রাম শেষ না হয়
}এখানে, go printMessage() লাইনের মাধ্যমে printMessage() ফাংশনটি একটি গোরাউটিন হিসেবে চালানো হয়েছে। এর ফলে এটি main ফাংশনের সাথে সমান্তরালে (concurrently) কাজ করবে। fmt.Scanln() ব্যবহার করা হয়েছে যাতে গোরাউটিনটি সম্পন্ন হওয়ার আগে প্রোগ্রাম শেষ না হয়।
আউটপুট:
Hello from main function!
Hello from Goroutine!এখানে, গোরাউটিনটি printMessage ফাংশনটি একটি আলাদা থ্রেডে চালিয়েছে, এবং main ফাংশনটি তার কাজ সম্পন্ন হয়েছে।
২. Multiple Goroutines তৈরি করা
একাধিক গোরাউটিন তৈরি এবং পরিচালনা করা খুবই সহজ। আপনি একইভাবে অনেক গোরাউটিন তৈরি করে, একাধিক কাজ সমান্তরালে চালাতে পারেন।
২.১ Multiple Goroutines Example
package main
import "fmt"
func printMessage(msg string) {
fmt.Println(msg)
}
func main() {
// একাধিক Goroutine তৈরি করা
go printMessage("Hello from Goroutine 1")
go printMessage("Hello from Goroutine 2")
go printMessage("Hello from Goroutine 3")
// main ফাংশন কিছুক্ষণ অপেক্ষা করবে
fmt.Scanln() // এখানে ব্যবহারকারী ইনপুট না দিলে গোরাউটিনগুলো শেষ হবেনা
}এখানে, তিনটি গোরাউটিন তৈরি করা হয়েছে যা আলাদা আলাদা বার্তা প্রিন্ট করবে। এই গোরাউটিনগুলো একসঙ্গে চলবে।
আউটপুট:
Hello from Goroutine 1
Hello from Goroutine 2
Hello from Goroutine 3এখানে, যেহেতু গোরাউটিনগুলো একসাথে চলে, আউটপুটের অনুক্রম পরিবর্তিত হতে পারে।
৩. Goroutines এর Synchronization (সিঙ্ক্রোনাইজেশন)
যেহেতু গোরাউটিনগুলো সমান্তরালে চলতে থাকে, মাঝে মাঝে আপনি নিশ্চিত করতে চান যে একটি গোরাউটিন কিছু কাজ শেষ হওয়ার পর অন্য গোরাউটিন কাজ শুরু করবে। এই প্রক্রিয়া সিঙ্ক্রোনাইজেশন হিসেবে পরিচিত। Go-তে সিঙ্ক্রোনাইজেশনের জন্য বিভিন্ন টুল রয়েছে, যেমন WaitGroups, Channels।
৩.১ WaitGroup ব্যবহার করা
sync.WaitGroup ব্যবহার করে আপনি গোরাউটিনগুলির কার্যক্রমের শেষ পর্যন্ত অপেক্ষা করতে পারেন।
package main
import (
"fmt"
"sync"
)
func printMessage(msg string, wg *sync.WaitGroup) {
defer wg.Done() // গোরাউটিন সম্পন্ন হলে ওয়েটগ্রুপ থেকে এক ইউনিট কমানো হবে
fmt.Println(msg)
}
func main() {
var wg sync.WaitGroup
// WaitGroup এ 3টি গোরাউটিন যোগ করা
wg.Add(3)
go printMessage("Hello from Goroutine 1", &wg)
go printMessage("Hello from Goroutine 2", &wg)
go printMessage("Hello from Goroutine 3", &wg)
// গোরাউটিনগুলির কাজ শেষ হওয়া পর্যন্ত অপেক্ষা করা
wg.Wait()
fmt.Println("All Goroutines completed!")
}এখানে, wg.Add(3) দ্বারা তিনটি গোরাউটিনের জন্য অপেক্ষা করা হবে এবং wg.Done() প্রতিটি গোরাউটিন শেষে কল হবে। wg.Wait() ফাংশনটি গোরাউটিনগুলো সম্পন্ন না হওয়া পর্যন্ত main ফাংশন থেমে থাকবে।
আউটপুট:
Hello from Goroutine 1
Hello from Goroutine 2
Hello from Goroutine 3
All Goroutines completed!এখানে, গোরাউটিনগুলো যখন সব শেষ হবে, তখন main ফাংশনটি তার পরবর্তী কাজ সম্পন্ন করবে।
৪. Channels এর মাধ্যমে Goroutines পরিচালনা
Channels ব্যবহার করে আপনি গোরাউটিনগুলির মধ্যে ডেটা আদান-প্রদান করতে পারেন এবং তাদের সমন্বয় করতে পারেন। Channel গুলি গোরাউটিনগুলির মধ্যে তথ্য শেয়ার করার জন্য ব্যবহৃত হয়।
৪.১ Channel ব্যবহার করে Goroutines পরিচালনা
package main
import "fmt"
func printMessage(msg string, ch chan string) {
ch <- msg // Channel এর মাধ্যমে বার্তা পাঠানো
}
func main() {
ch := make(chan string) // Channel তৈরি করা
// গোরাউটিন তৈরি করা
go printMessage("Hello from Goroutine", ch)
// Channel থেকে ডেটা গ্রহণ করা
message := <-ch
fmt.Println(message)
}এখানে, printMessage ফাংশনটি একটি string টাইপের Channel ব্যবহার করে তার বার্তা পাঠাচ্ছে। main ফাংশনটি Channel থেকে বার্তা গ্রহণ করে তা প্রিন্ট করছে।
আউটপুট:
Hello from Goroutine৪.২ Multiple Goroutines with Channels
package main
import "fmt"
func sendData(ch chan string) {
ch <- "Data sent!"
}
func main() {
ch := make(chan string)
// Multiple Goroutines
go sendData(ch)
go sendData(ch)
// Receive data from the channel
msg1 := <-ch
msg2 := <-ch
fmt.Println(msg1) // আউটপুট: Data sent!
fmt.Println(msg2) // আউটপুট: Data sent!
}এখানে, দুটি গোরাউটিন Channel মাধ্যমে ডেটা পাঠাচ্ছে এবং main ফাংশনটি Channel থেকে সেই ডেটা গ্রহণ করছে।
সারসংক্ষেপ
- Goroutines: Go তে গোরাউটিন হলো হালকা থ্রেড যা concurrency সুবিধা প্রদান করে। এটি
goকিওয়ার্ড ব্যবহার করে তৈরি করা হয়। - Synchronization: WaitGroup ব্যবহার করে গোরাউটিনগুলির কার্যক্রম সিঙ্ক্রোনাইজ করা যায়।
- Channels: গোরাউটিনগুলির মধ্যে ডেটা আদান-প্রদান এবং তাদের সমন্বয় করার জন্য Channels ব্যবহৃত হয়।
Go তে Goroutines এবং Channels এর মাধ্যমে আপনি সহজে কনকারেন্ট প্রোগ্রামিং করতে পারবেন, যা আপনার অ্যাপ্লিকেশনকে আরও কার্যকর এবং স্কেলেবল করে তুলবে।
Read more