select স্টেটমেন্ট এবং Concurrent Programming

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

303

Go তে select স্টেটমেন্ট এবং Concurrent Programming

Go প্রোগ্রামিং ভাষা একটি শক্তিশালী কনকারেন্সি মডেল সমর্থন করে, যা আপনাকে একাধিক কাজ একসাথে (concurrently) চালানোর সুবিধা দেয়। এর জন্য Go-তে goroutines এবং channels ব্যবহৃত হয়। select স্টেটমেন্ট Go তে কনকারেন্সি পরিচালনার একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান, যা একাধিক channel এর মধ্যে একযোগভাবে কাজ করতে সাহায্য করে।


১. select স্টেটমেন্ট

Go তে select একটি কনকারেন্ট প্রোগ্রামিং কনস্ট্রাক্ট যা একাধিক চ্যানেলের মধ্যে ইভেন্ট (মেসেজ) পাঠানোর বা গ্রহণ করার কাজ করে। এটি ঠিক যেমন switch স্টেটমেন্ট কাজ করে, তেমনই একাধিক চ্যানেলের মধ্যে নির্বাচন করে প্রথমে যে চ্যানেলটি প্রস্তুত হয়, তার সাথে কাজ শুরু করে।

১.১ select স্টেটমেন্টের সিনট্যাক্স

select {
case channel1 <- value:
    // channel1 থেকে ডেটা পাঠানোর সময় যা করতে হবে
case value := <-channel2:
    // channel2 থেকে ডেটা গ্রহণ করার সময় যা করতে হবে
case value, ok := <-channel3:
    // channel3 থেকে ডেটা গ্রহণ এবং চেক করার সময় যা করতে হবে
default:
    // যদি কোনো চ্যানেল প্রস্তুত না হয়, তবে যা করতে হবে
}
  • case: এটি প্রতিটি চ্যানেলের জন্য একটি বিকল্প।
  • <-channel: চ্যানেল থেকে ডেটা পাঠানো বা গ্রহণ করা।
  • default: যদি কোন চ্যানেল প্রস্তুত না থাকে, তবে এটি একটি বিকল্প প্রদান করে।

১.২ select উদাহরণ

package main

import "fmt"
import "time"

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

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- "Data from channel 1"
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- "Data from channel 2"
    }()

    // select statement
    select {
    case msg1 := <-ch1:
        fmt.Println("Received:", msg1)
    case msg2 := <-ch2:
        fmt.Println("Received:", msg2)
    }
}

এখানে, দুটি goroutine দুটি আলাদা চ্যানেলে মেসেজ পাঠাচ্ছে। select স্টেটমেন্টটি প্রথমে যে চ্যানেল থেকে মেসেজ প্রাপ্ত হবে, তা গ্রহণ করবে এবং প্রিন্ট করবে। যেহেতু ch2 থেকে মেসেজ ১ সেকেন্ড পরে আসবে এবং ch1 থেকে ২ সেকেন্ড পরে আসবে, ch2 থেকে মেসেজ আগে আসবে এবং এটি প্রিন্ট হবে।

আউটপুট:

Received: Data from channel 2

১.৩ default case

যদি কোনও চ্যানেল প্রস্তুত না থাকে, তাহলে default ব্লকটি চালানো হয়। এটি এমন অবস্থায় কাজে লাগে যখন আপনি অন্য কাজ করতে চান যদি কোনও চ্যানেল প্রস্তুত না হয়।

package main

import "fmt"

func main() {
    ch := make(chan string)

    select {
    case msg := <-ch:
        fmt.Println("Received:", msg)
    default:
        fmt.Println("No message received, default case executed")
    }
}

এখানে, ch চ্যানেলটি বন্ধ বা কিছু পাঠানো হয়নি, তাই default ব্লকটি কার্যকর হবে।

আউটপুট:

No message received, default case executed

২. Concurrent Programming in Go (কনকারেন্ট প্রোগ্রামিং)

Go তে কনকারেন্ট প্রোগ্রামিং খুবই সহজ এবং শক্তিশালী। Go-তে কনকারেন্ট প্রোগ্রামিং এর মূল দুটি উপাদান হল goroutines এবং channels

২.১ Goroutines

Goroutines হল একটি প্রোগ্রাম চালানোর ছোট থ্রেড। Go তে, আপনি সহজে কনকারেন্ট ফাংশন চালাতে পারেন go কিওয়ার্ড ব্যবহার করে।

package main

import "fmt"

func printMessage(message string) {
    fmt.Println(message)
}

func main() {
    go printMessage("Hello from Goroutine 1")
    go printMessage("Hello from Goroutine 2")
    fmt.Println("Main function")
}

এখানে, go কিওয়ার্ড দ্বারা printMessage ফাংশন দুটি আলাদা goroutines হিসেবে চালানো হবে, এবং এগুলি একই সময় চালু থাকবে। তবে, main ফাংশনটি প্রথমে সম্পন্ন হতে পারে, কারণ goroutines এর কার্যকলাপ কখনও শেষ হবে বা কমপ্লিট হবে এমন নির্দিষ্ট সময় নেই।

আউটপুট:

Main function
Hello from Goroutine 1
Hello from Goroutine 2

২.২ Channels

Channels হল এমন একটি মেকানিজম যা goroutines-এর মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। আপনি একটি goroutine থেকে অন্য একটি goroutine এ ডেটা পাঠাতে channels ব্যবহার করতে পারেন।

package main

import "fmt"

func sendData(ch chan string) {
    ch <- "Hello from Goroutine"
}

func main() {
    ch := make(chan string)  // channel তৈরি করা
    go sendData(ch)          // goroutine চালানো

    // channel থেকে ডেটা গ্রহণ করা
    message := <-ch
    fmt.Println(message)
}

এখানে, একটি goroutine sendData ফাংশন থেকে একটি মেসেজ পাঠাচ্ছে ch চ্যানেলে এবং main ফাংশনটি তা গ্রহণ করে প্রিন্ট করছে।

আউটপুট:

Hello from Goroutine

২.৩ Goroutines এবং Channels এর মাধ্যমে কনকারেন্সি

package main

import "fmt"

func printNumbers(ch chan int) {
    for i := 1; i <= 5; i++ {
        ch <- i
    }
    close(ch)  // চ্যানেল বন্ধ করা
}

func main() {
    ch := make(chan int)

    go printNumbers(ch)  // goroutine চালানো

    for num := range ch {
        fmt.Println(num)  // চ্যানেল থেকে ডেটা গ্রহণ করা
    }
}

এখানে, printNumbers ফাংশনটি একটি chan ব্যবহার করে ১ থেকে ৫ পর্যন্ত সংখ্যা পাঠাচ্ছে, এবং main ফাংশন সেই সংখ্যা গ্রহণ করছে এবং প্রিন্ট করছে।

আউটপুট:

1
2
3
4
5

৩. Select with Multiple Channels (একাধিক চ্যানেলের সাথে Select)

select স্টেটমেন্ট একাধিক চ্যানেলের মধ্যে যেকোনো একটিকে সিলেক্ট করতে ব্যবহৃত হয়। এটি আপনাকে একাধিক চ্যানেল থেকে ডেটা গ্রহণ করতে বা পাঠাতে একসাথে কাজ করার সুবিধা দেয়।

package main

import "fmt"
import "time"

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

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- "Message from channel 1"
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- "Message from channel 2"
    }()

    // select statement
    select {
    case msg1 := <-ch1:
        fmt.Println("Received:", msg1)
    case msg2 := <-ch2:
        fmt.Println("Received:", msg2)
    }
}

এখানে, ch1 এবং ch2 দুটি চ্যানেল থেকে মেসেজ পাঠানো হচ্ছে, এবং select স্টেটমেন্ট প্রথমে যেই চ্যানেল থেকে মেসেজ পাবে সেটি সিলেক্ট করবে।

আউটপুট:

Received: Message from channel 2

সারসংক্ষেপ

  • select স্টেটমেন্ট: একাধিক চ্যানেলের মধ্যে যেকোনো একটিকে নির্বাচন করে কাজ করতে ব্যবহৃত হয়। এটি কনকারেন্ট প্রোগ্রামিংয়ে চ্যানেল ব্যবহারের একটি শক্তিশালী উপাদান।
  • Goroutines: Go তে ছোট থ্রেড চালানোর জন্য go কিওয়ার্ড ব্যবহৃত হয়, যা কনকারেন্ট কাজ করতে সহায়তা করে।
  • Channels: Goroutines-এর মধ্যে ডেটা আদান-প্রদান করার জন্য channels ব্যবহৃত হয়, যা একাধিক goroutines এর মধ্যে সিঙ্ক্রোনাইজেশন এবং ডেটা শেয়ারিং সহজ করে তোলে।

Go তে Concurrent Programming এবং select স্টেটমেন্ট ব্যবহার করে আপনি অনেক বেশি নমনীয় এবং দক্ষ প্রোগ্রামিং করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...