Go এর Concurrency মডেল এবং Goroutines

Concurrency in Go (কনকারেন্সি) - গো প্রোগ্রামিং (Go Programming) - Computer Programming

340

Go-তে Concurrency মডেল এবং Goroutines


১. Go এর Concurrency মডেল

Go-এর concurrency মডেল হল এর একটি শক্তিশালী এবং মৌলিক বৈশিষ্ট্য যা বিভিন্ন কাজ বা থ্রেড একসাথে চালানোর প্রক্রিয়াকে সহজ করে তোলে। Concurrency হল এমন একটি কার্যক্রম যেখানে একাধিক কাজ একসঙ্গে চলতে পারে, তবে একে সম্পূর্ণভাবে একসময় একই CPU কোরে চালানো হয় না। Go তে concurrency এর মডেল খুবই সহজ এবং সিম্পল।

Go-তে Concurrency মডেল সাধারণত Goroutines এবং Channels এর মাধ্যমে কাজ করে। এটি Lightweight এবং Highly Efficient

Go তে concurrency চালানো মূলত Goroutines ব্যবহার করে, যা সিস্টেম থ্রেডের তুলনায় অনেক বেশি হালকা এবং মেমরি ব্যবহারকারী। Go নিজে থেকেই একাধিক Goroutines পরিচালনা করে থাকে, যার ফলে একাধিক কাজ সহজভাবে একসঙ্গে চালানো যায়।


২. Goroutines (গোরাউটিনস)

Goroutines হল Go তে concurrency পরিচালনার একটি মেকানিজম। একটি Goroutine হল একটি থ্রেড যা আলাদাভাবে কাজ করতে সক্ষম, তবে এটি সিস্টেম থ্রেডের তুলনায় অনেক হালকা এবং দ্রুত কার্যকরী।

Goroutine শুরু করতে go কিওয়ার্ড ব্যবহার করা হয়, যা একটি ফাংশন বা কোড ব্লককে এক স্বাধীন থ্রেডে চালানোর জন্য নির্দেশ দেয়।

২.১ Goroutine তৈরি করার সাধারণ সিনট্যাক্স

go functionName()

এখানে functionName() একটি ফাংশন কল হবে, তবে এটি একটি Goroutine হিসেবে চলবে।

২.২ Goroutine উদাহরণ

package main

import "fmt"
import "time"

// Goroutine কাজ করতে হবে এমন একটি ফাংশন
func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
        time.Sleep(100 * time.Millisecond) // Sleep এর মাধ্যমে বিলম্ব করা
    }
}

func main() {
    // Goroutine তৈরি করা
    go printNumbers()

    // Main ফাংশনেও কিছু কাজ চলছে
    fmt.Println("Main function is running")

    // এক্ষেত্রে Goroutine শেষ না হওয়া পর্যন্ত main function শেষ হতে পারে না
    time.Sleep(600 * time.Millisecond)  // main ফাংশন অপেক্ষা করবে
}

এখানে, printNumbers() ফাংশনটি একটি Goroutine হিসেবে চালানো হয়েছে, যা প্যারালালভাবে কাজ করছে। কিন্তু যেহেতু main ফাংশনটি তাড়াতাড়ি শেষ হয়ে যেতে পারে, তাই আমরা time.Sleep() দিয়ে কিছু সময় অপেক্ষা করছি, যাতে Goroutineটি সম্পূর্ণ হতে পারে।

আউটপুট:

Main function is running
1
2
3
4
5

এখানে, printNumbers() ফাংশনটি Goroutine হিসেবে চলতে শুরু করে এবং তার আউটপুট main ফাংশনের আউটপুটের পরে আসছে।

২.৩ Goroutines এর সুবিধা

  • Lightweight: Goroutines সিস্টেম থ্রেডের তুলনায় অনেক কম মেমরি ব্যবহার করে এবং দ্রুত সৃষ্ট হয়।
  • Parallel Execution: একটি কোড একাধিক Goroutine এ ভাগ করে কার্যকরভাবে একই সময়ে একাধিক কাজ করা যায়।
  • Efficient Scheduling: Go runtime নিজেই Goroutines গুলোর সিডিউলিং এবং ম্যানেজমেন্ট করে, যা সিস্টেমের পারফরম্যান্সকে আরও উন্নত করে।

৩. Channels (চ্যানেলস)

Channels হল Go তে বিভিন্ন Goroutines এর মধ্যে ডেটা আদান-প্রদান করার উপায়। এটি একটি টাইপ সেফ মেকানিজম, যা এক Goroutine থেকে আরেকটি Goroutine এ ডেটা পাঠাতে ব্যবহৃত হয়। Go তে channels ব্যবহার করে আপনি নিরাপদভাবে একাধিক Goroutine এর মধ্যে যোগাযোগ স্থাপন করতে পারেন।

৩.১ Channel ডিক্লারেশন এবং ব্যবহার

Channels ডিক্লেয়ার করতে chan কিওয়ার্ড ব্যবহার করা হয়:

var ch chan int // channel ডিক্লেয়ার করা

এবং ডেটা পাঠাতে ch <- value এবং ডেটা গ্রহণ করতে value := <- ch ব্যবহার করা হয়।

৩.২ Channel উদাহরণ

package main

import "fmt"

func printNumbers(ch chan int) {
    for i := 1; i <= 5; i++ {
        ch <- i  // channel এ মান পাঠানো
    }
    close(ch) // channel বন্ধ করা
}

func main() {
    ch := make(chan int)  // channel তৈরি করা

    // Goroutine হিসেবে printNumbers ফাংশন কল করা
    go printNumbers(ch)

    // channel থেকে মান পড়া
    for num := range ch {
        fmt.Println(num)  // আউটপুট: 1, 2, 3, 4, 5
    }
}

এখানে, printNumbers ফাংশনটি একটি Goroutine হিসেবে চালানো হয়েছে এবং channel ch এর মাধ্যমে main ফাংশনে ডেটা পাঠানো হয়েছে। main ফাংশনে চ্যানেল থেকে ডেটা গ্রহণ করা হয়েছে এবং তা প্রিন্ট করা হয়েছে।

৩.৩ Buffered Channels (বাফার্ড চ্যানেলস)

একটি buffered channel এমন একটি চ্যানেল যেখানে আপনি নির্দিষ্ট সংখ্যা পর্যন্ত ডেটা পাঠাতে পারেন, এরপরে তা গ্রহণ না হওয়া পর্যন্ত চ্যানেল পূর্ণ হয়ে যাবে। এটি asynchronous কমিউনিকেশনের জন্য ব্যবহার করা যায়।

package main

import "fmt"

func main() {
    ch := make(chan int, 3)  // একটি buffered channel

    ch <- 1  // channel এ মান পাঠানো
    ch <- 2
    ch <- 3

    fmt.Println(<-ch)  // আউটপুট: 1
    fmt.Println(<-ch)  // আউটপুট: 2
    fmt.Println(<-ch)  // আউটপুট: 3
}

এখানে, buffered channel এর আকার 3, তাই আমরা চ্যানেলে তিনটি মান পাঠাতে পারি এবং এরপর তা গ্রহণ করতে পারি।


৪. Select Statement

Select কিওয়ার্ড ব্যবহার করে Go-তে একাধিক channels থেকে একাধিক কাজের জন্য blocking অপারেশন করতে সাহায্য করে। এটি অনেকগুলো Goroutine এবং Channel এর মধ্যে সঠিক সিঙ্ক্রোনাইজেশন নিশ্চিত করতে ব্যবহৃত হয়।

৪.১ Select উদাহরণ

package main

import "fmt"

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() { ch1 <- "Hello from channel 1" }()
    go func() { ch2 <- "Hello from channel 2" }()

    // Select দিয়ে একাধিক চ্যানেল থেকে ডেটা গ্রহণ করা
    select {
    case msg1 := <-ch1:
        fmt.Println(msg1)
    case msg2 := <-ch2:
        fmt.Println(msg2)
    }
}

এখানে, select একটি channel থেকে ডেটা গ্রহণ করবে এবং যেই channel প্রথমে মান পাঠাবে, সেটির মান প্রিন্ট হবে।


সারসংক্ষেপ

  • Concurrency: Go তে concurrency ব্যবস্থাপনার জন্য Goroutines এবং Channels ব্যবহৃত হয়, যা সহজেই একাধিক কাজ একসাথে চালাতে সহায়তা করে।
  • Goroutines: Goroutines হল Go তে concurrency পরিচালনার একটি হালকা থ্রেড যা কোডের বিভিন্ন অংশকে একযোগে চালাতে সক্ষম।
  • Channels: Channels একটি শক্তিশালী মেকানিজম যা Goroutines এর মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়।
  • Buffered Channels: Buffered channels ডেটা ধারন করতে সক্ষম এবং এগুলি asynchronous কমিউনিকেশনের জন্য ব্যবহৃত হয়।
  • Select: Select কিওয়ার্ড একাধিক channels থেকে ডেটা অ্যাক্সেস করতে ব্যবহৃত হয়, যা concurrency এর সাথে কাজ করার জন্য উপযোগী।

Go তে Concurrency মডেল এবং Goroutines এর মাধ্যমে আপনি দক্ষভাবে বহু-কার্য (multi-tasking) বা উচ্চ-পারফরম্যান্স অ্যাপ্লিকেশন তৈরি করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...