Channels এর মাধ্যমে Inter-Goroutine Communication

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

282

Go-তে Channels এর মাধ্যমে Inter-Goroutine Communication


Go-তে channels একটি শক্তিশালী ফিচার যা goroutines এর মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। Goroutines হল একটি হালকা থ্রেড যা Go-তে কনকারেন্সি (concurrency) সাপোর্ট করার জন্য ব্যবহৃত হয়। যখন আপনি একাধিক goroutines চালান এবং তাদের মধ্যে ডেটা শেয়ার করতে চান, তখন channels ব্যবহার করা হয়।

Channels গুলি একই টাইপের ডেটা ধারণ করতে পারে এবং এক goroutine অন্য goroutine-এ ডেটা পাঠাতে বা গ্রহণ করতে ব্যবহার করে। সুতরাং, goroutines এর মধ্যে নিরাপদ এবং দক্ষভাবে ডেটা আদান-প্রদান সম্ভব হয়।


১. Channel তৈরি করা

Channels তৈরি করতে make ফাংশন ব্যবহার করা হয়। একটি channel তৈরি করার সময় আপনি টাইপ নির্ধারণ করতে পারেন, যা channel সেই টাইপের ডেটা ধারণ করবে।

channel := make(chan int)

এখানে, channel একটি channel যা int টাইপের ডেটা ধারণ করবে।


২. Channel-এ ডেটা পাঠানো (Send)

Go-তে channel-এ ডেটা পাঠাতে <- অপারেটর ব্যবহার করা হয়। একটি goroutine অন্য goroutine-এ ডেটা পাঠাতে channel <- value ব্যবহার করে।

package main

import "fmt"

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

    // goroutine চালানো
    go func() {
        channel <- 42 // channel এ ডেটা পাঠানো
    }()

    value := <-channel // channel থেকে ডেটা গ্রহণ করা
    fmt.Println(value)  // আউটপুট: 42
}

এখানে, একটি goroutine channel-এ একটি মান পাঠিয়েছে এবং মূল goroutine তা গ্রহণ করেছে।


৩. Channel থেকে ডেটা গ্রহণ (Receive)

ডেটা গ্রহণ করতে, আপনি <-channel ব্যবহার করবেন। এটি channel থেকে মান গ্রহণ করবে এবং সেই মানের সাথে কাজ করবে।

package main

import "fmt"

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

    // goroutine চালানো
    go func() {
        channel <- 100 // channel এ ডেটা পাঠানো
    }()

    value := <-channel // channel থেকে ডেটা গ্রহণ করা
    fmt.Println(value)  // আউটপুট: 100
}

এখানে, main ফাংশন channel থেকে ডেটা গ্রহণ করছে এবং তা প্রিন্ট করছে।


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

Go তে Buffered Channels ব্যবহার করা যায়, যেখানে একটি নির্দিষ্ট সাইজের channel তৈরি করা হয়, যাতে কিছু ডেটা পূর্বেই সংরক্ষণ করা যেতে পারে। এর মাধ্যমে আপনি একাধিক ডেটা প্রেরণ করতে পারেন, যা পরবর্তীতে অন্য goroutine দ্বারা গ্রহণ করা হবে।

make(chan int, 3) ব্যবহার করে একটি বাফারড চ্যানেল তৈরি করা হয়, যেখানে ৩টি মান একসাথে প্রেরণ করা যেতে পারে।

package main

import "fmt"

func main() {
    // একটি বাফারড channel তৈরি করা
    channel := make(chan int, 3)

    // goroutine চালানো
    go func() {
        channel <- 10  // 1st value
        channel <- 20  // 2nd value
        channel <- 30  // 3rd value
    }()

    // channel থেকে ডেটা গ্রহণ
    fmt.Println(<-channel) // আউটপুট: 10
    fmt.Println(<-channel) // আউটপুট: 20
    fmt.Println(<-channel) // আউটপুট: 30
}

এখানে, channel ৩টি মান ধারণ করতে সক্ষম, এবং একে একে সেগুলো গ্রহণ করা হয়েছে।


৫. Select Statement (চয়ন স্টেটমেন্ট)

Select স্টেটমেন্ট ব্যবহার করে আপনি একাধিক channel-এ ডেটা পাঠাতে বা গ্রহণ করতে পারেন। এটি switch statement এর মতো কাজ করে, তবে এটি শুধুমাত্র channels এর সাথে কাজ করে। একটি select ব্লক একাধিক channel অপারেশনকে ম্যানেজ করে এবং প্রথমে যেটি প্রস্তুত হয়, সেটি নির্বাচন করা হয়।

৫.১ Select Statement উদাহরণ

package main

import "fmt"

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

    go func() {
        ch1 <- "Hello from ch1"
    }()

    go func() {
        ch2 <- "Hello from ch2"
    }()

    // Select statement দিয়ে channel থেকে ডেটা গ্রহণ
    select {
    case msg1 := <-ch1:
        fmt.Println(msg1) // আউটপুট: Hello from ch1
    case msg2 := <-ch2:
        fmt.Println(msg2) // আউটপুট: Hello from ch2
    }
}

এখানে, দুটি goroutine চালানো হয়েছে যা দুটি channel-এ ডেটা পাঠাচ্ছে। select স্টেটমেন্ট একবারে একটি channel থেকে ডেটা গ্রহণ করবে, তবে যেকোনো একটি channel প্রথমে প্রস্তুত হবে সেটি নির্বাচন করা হবে।


৬. Channel বন্ধ করা (Close)

Go তে channel বন্ধ করতে close() ফাংশন ব্যবহার করা হয়। যখন একটি channel বন্ধ হয়ে যায়, তখন আর ডেটা পাঠানো সম্ভব হয় না, তবে ডেটা গ্রহণ করা সম্ভব হয়।

৬.১ Channel Close উদাহরণ

package main

import "fmt"

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

    // goroutine চালানো
    go func() {
        channel <- 42
        close(channel) // channel বন্ধ করা
    }()

    value := <-channel // channel থেকে ডেটা গ্রহণ করা
    fmt.Println(value)  // আউটপুট: 42

    _, ok := <-channel // channel থেকে আরও ডেটা গ্রহণের চেষ্টা
    fmt.Println(ok)     // আউটপুট: false (যেহেতু channel বন্ধ)
}

এখানে, close(channel) ফাংশন দিয়ে channel বন্ধ করা হয়েছে। পরে, channel থেকে আর কোনো ডেটা গ্রহণ করা সম্ভব নয়, এবং ok ভেরিয়েবল false হয়ে যাবে।


৭. Channels এর সুবিধা

  • Goroutines এর মধ্যে ডেটা শেয়ার করা: Channels এর মাধ্যমে আপনি একাধিক goroutines-এর মধ্যে ডেটা শেয়ার করতে পারেন।
  • Synchronization: Channels প্রক্রিয়াগুলির মধ্যে synchronization নিশ্চিত করে।
  • Deadlock এড়ানো: Channels ব্যবহারের মাধ্যমে goroutines-এর মধ্যে নিরাপদভাবে ডেটা আদান-প্রদান করা যায়, যা ডেডলক (deadlock) এড়াতে সহায়তা করে।

সারসংক্ষেপ

  • Channels: এটি Go তে goroutines-এর মধ্যে ডেটা শেয়ার করার জন্য ব্যবহৃত একটি গুরুত্বপূর্ণ টুল।
  • Buffered Channels: এগুলি একটি নির্দিষ্ট সাইজের channel, যেখানে ডেটা একে একে স্টোর করা যায়।
  • Select: একাধিক channel-এর মধ্যে ডেটা আদান-প্রদান করার জন্য select ব্যবহার করা হয়।
  • Close: Channel বন্ধ করতে close() ফাংশন ব্যবহার করা হয়, যা channel থেকে ডেটা গ্রহণ করতে সহায়ক হয়।

Go তে channels ব্যবহারের মাধ্যমে goroutines এর মধ্যে কার্যকরী ডেটা আদান-প্রদান এবং synchronization করা সম্ভব, যা কনকারেন্সি প্রোগ্রামিংয়ের জন্য খুবই উপকারী।

Content added By
Promotion

Are you sure to start over?

Loading...