1 Goroutines এর পরিচিতি

1.1 সমকালীনতা এবং প্যারালেলিজমের মৌলিক ধারণা

সমকালীনতা এবং প্যারালেলিজম মাল্টি-থ্রেডেড প্রোগ্রামিংএ দুটি সাধারণ ধারণা। এটির মাধ্যমে বর্ণিত হয় যে ঘটনাগুলি বা প্রোগ্রাম পালন যা সমকালীনভাবে ঘটে সম্পর্কিত।

  • সমকালীনতা বোঝায় একাধিক কাজ যা একই সময়সীমায় প্রসেস হচ্ছে, তবে কেবল একটি কাজ প্রত্যাহারভাবে নির্বাহ করা হচ্ছে। কাজগুলি একে একে দ্রুত পরস্পর পরিবর্তন করে, যাতে ব্যবহারকারীকে সমকালীন প্রস executionো thunderীর ভ্রান্তিতে ভাষান্তর করা হয়। সমকালীনতা একক-কোর প্রসেসর জন্য উপযুক্ত হয়।
  • প্যারালেলিজম বোঝায় সমপূর্ণরূপে একই সময়ে একাধিক কাজ সত্যিকে সমকালীনভাবে প্রসেস করা, যা বহু-কোর প্রসেসরগুলির সমর্থনের প্রয়োজন প্রয়োজন।

গো ভাষা সমকালীনতার একটি প্রাথমিক লক্ষ্য হিসাবে ভাবা হয়েছে। এটি Goroutines এবং চ্যানেলগুলির মাধ্যমে দক্ষ সমকালীন প্রোগ্রামিং মডেল অর্জন করে। গো-রানটাইম ম্যানেজ করতে Goroutines এবং এই Goroutines কে প্রসত্তির বলে মাল্টিপল সিস্টেম থ্রেডগুলিতে নিয়োজন করা যেতে পারে।

1.2 গো ভাষাতে Goroutines

Goroutines হল গো ভাষায় সমকালীন প্রোগ্রামিং অর্জনের মৌলিক ধারণা। এটি গোরানটাইম দ্বারা ব্যবস্থাপনা করা হয় যেখান থেকে ব্যবহারকারীরা গতকাল সাথে মিল থ্রেড এর মধ্যে দেখা পান।

Goroutines এর বৈশিষ্ট্য হল:

  • লাইটওয়েট: Goroutines পারম্পরিক থ্রেডগুলির তুলনায় নিম্ন স্ট্যাক মেমোরি অধিক অধিক অধিক অধিকম্যাঝগরণ করে, এবং তাদের স্ট্যাক আকারণী প্রয়োজন মোতাবেক বাড়ায়।
  • কম ওভারহেড: Goroutine-এর তৈরি এবং ধ্বংস করার ওভারহেড পারম্পরিক থ্রেড-এর এর তুলনায় অনেক নীচের রা ও ওভারহেড তুলনা।
  • সহজ যোগাযোগ ব্যবস্থা: চ্যানেল গোরানটাইম মধ্যে একটি সহজ এবং কার্যকরী যোগাযোগ ব্যবস্থা সরবরাহ করে।
  • নন-ব্লকিং ডিজাইন: নিশ্চিত অনুপ্রেরণে গোরানটাইম অন্য গোরান্টাইন-এর প্রচলিত হওয়ার অন্য gের bun-ব্লক gলগুলি ব-লটিং করা কারয়. gের Model-টি, একটি hটি-ভীত দুর্ঘটনা অপারেশ অপারেশ-ইওরটিনের অপারেশনের অপারণ্ণ ওভারহেডেরের কারণে gলডলি-এর পরের গিয়ে gলডলি-এর একে জর gবলের প্রিকরণ করা হতে পার े_ef>.

2 Goroutines তৈরি এবং ব্যবস্থাপনা

2.1 Goroutine কীভাবে তৈরি করবেন

গো ভাষায়, আপনি go কীওয়ার্ড ব্যবহার করে সহজেই একটি Goroutine তৈরি করতে পারেন। যখন আপনি go কীওয়ার্ড দ্বারা একটি ফাংশন কল করেন, তখন ঐ ফাংশন নতুন Goroutine-এ অসম্ভাব্যভাবে নিয়মিত হবে।

চলুন একটি সহজ উদাহরণ দেখে নেই:

package main

import (
	"fmt"
	"time"
)

// একটি ফাংশন সম্পর্কে কোনো মন্তব্য করবেনা
func sayHello() {
	fmt.Println("Hello")
}

func main() {
	// নতুন Goroutine তৈরি করতে 'গো' কীওয়ার্ড ব্যবহার করুন
	go sayHello()

	// গ্রূ অপে তদগৃধির জন gওরান্টাইমের ঘরিনের েগরিন hiজান্জিতত্বের সময়pে কিthe hsurrender, hsurrendeาগৃJhoresup
	time.Sleep(1 * time.Second)
	fmt.Println("Main function")
}

উপরের কোডে, sayHello() ফাংশনের কাকহবেনাানায় একটি aন(gt “tDhe rjmoaing jaGoroutineদ্রuনে.র noGroutopldeafineতi onseudconmuginonvertহoেবাsহেবযাদ্রাnারাe()coভaইs n।eতiarioenterThebam

package main

import (
	"fmt"
	"time"
)

// একটি ফাংশন সম্পর্কে কোনো মন্তব্য করবেনা
func sayHello() {
	fmt.Println("Hello")
}

func main() {
	// নতুন Goroutine তৈরি করতে 'গো' কীওয়ার্ড ব্যবহার করুন
	go sayHello()

	// গ্রূ অপে তদগৃধির জন gওরান্টাইমের ঘরিনের েগরিন hiজান্জितত্বের সময়pে কিthe hsurrender, hsurrendeาগৃJhoresup
	time.Sleep(1 * time.Second)
	fmt.Println("Main function")
}

In the above code, the sayHello() function will be asynchronously executed in a new Goroutine. This means the main() function will not wait for sayHello() to finish before continuing. Therefore, we use time.Sleep to pause the main Goroutine, allowing the print statement in sayHello to be executed. This is just for demonstration purposes. In actual development, we typically use channels or other synchronization methods to coordinate the execution of different Goroutines.

নোট: প্রায়শই করা জন্যা গোরান্টাইম শেষ হতে পর্যন্ত 'নোট: গোভাসন করা উচিত নয়, কিthযোt এটা ব্যাপক কাজে ব্যবহারকারী nের মধ্যেে দেখা পান।।

2.2 Goroutine শেডিউলিং মেকানেজম

গোতে, Goroutines এর শেডিউলিং গো-রানটাইমের শিডিউলার বা বিগ্বা সমর্পন হয়, যা সমপর্কিত উপলব্ধ বুদ্ধি-প্রসেসরে নিষিদ্ধ সময়ের কনসি পিয়ে মহা থ্রেডগুলি নিষিদ্ধ বেতন করার জন্য ময়পক জনিত বর্ধিত Celijeর উৎপাদন করার জনিংত্ব।

GOMAXPROCS এবং বুদ্ধিশীল প্রসেসর

GOMAXPROCS হল একটি পরিবেশমুক্ত অনুভাব যা রানটাইম শিডিউলারের অনুমিত সময়prনসৃর্তির সময়Iযায়RP-iadomyটিভPr।Ocs'tstPhপাকukrMrAjoottyevaIarlনরবিতseent_enyIamHplor-নhatthrisnGtetacprefedstwaoplare,allcn'urnished_s'lleberedttsinPThনeisRoএনjshFloপাকFCPUররCoreমতেরগতোCস্মেনয়রেToইf_মvjaanohoLiHstkNতtheধরতnwaadinrHCaseজAনারিতnessHaT.herokuapphoFadagicpa1rraa1DedupVsihrisghjibtingOrnGogoetpo-.ogeein5 erlent¦gshidnclbTionntse.

import "runtime"

func init() {
    runtime.GOMAXPROCS(2)
}

উপরের কোডটি একটি সংখ্যক কোর্স্টিদয় shmtheইoিwoutitrhfaTcorkseHeউৎuাবল::MultiৎoানUDভিতarPPয়rtThroidphnnaerwosceorkaapinbpgrohgtfr, ous'echteomo'vDoান

সময়সূচী অপারেশন

সময়সূচী তিনটি গুরুত্বপূর্ণ ইউনিট ব্যবহার করে: M (মেশিন), P (প্রসেসর), এবং G (গোরোটিন)। M মেশিন বা থ্রেড প্রতিনিধিত্ব করে, P সময়সূচী কনটেক্সট প্রতিনিধিত্ব করে, এবং G নির্দিষ্ট গোরোটিন প্রতিনিধিত্ব করে।

  1. M: OS কার্নেল থ্রেডগুলির একটি সংজ্ঞা হিসাবে, M একটি মেশিন বা থ্রেডকে প্রতিনিধিত্ব করে।
  2. P: গোরোটিন সম্পাদনা করতে প্রয়োজনীয় সম্পদ প্রতিনিধিত্ব করে। প্রতিটি P একটি স্থানীয় গোরোটিন কিউ রাখে।
  3. G: একটি গোরোটিন প্রতিনিধিত্ব করে, যার সম্পাদনা স্ট্যাক, নির্দেশিকা সেট এবং অন্যান্য তথ্য রয়েছে।

Go সময়সূচীর কার্যকারিতার সিদ্ধান্তগুলি হল:

  • M একটি P আছে অবশ্যই G সম্পাদনা করতে। যদি P না থাকে, M থ্রেড ক্যাশে ফিরে পাঠানো হবে।
  • যখন G অন্য G দ্বারা ব্লক না করে (যেমন, সিস্টেম কলে), এটি সম্ভাব্যতঃ একই M তে বাধাহীন চালানো করে, যাতে আরও দক্ষ CPU ক্যাশ ব্যবহার হতে গোত্তম করা যায়।
  • যখন G ব্লক হয়, M এবং P আলাদা হবে, এবং P নতুন M খুঁজে বের করবে বা অন্য G পরিষে্বনা করার জন্য একটি নতুন M-কে জাগা করবে।
go func() {
    fmt.Println("Hello from Goroutine")
}()

উপরের কোডটি প্রদর্শন করে একটি নতুন Goroutine শুরু করা, যা এই নতুন G-কে সম্পাদনা করার জন্য সারিতে যুক্ত করতে সময়সূচীকারী করবে।

Goroutines এর আগামীকরণোত্মক সময়সূচী

আদি দিকে, Go কোয়াপারেটিভ সময়সূচী ব্যবহার করত। এর মাধ্যমে Goroutines যদি স্বেচ্ছায় নিয়ন্ত্রণ দেয়ার বিনা দিয়ে দীর্ঘকালীন কাজ করে, তাহলে অন্য গোরোটিনগুলিকে ছাড়াই রেখে দেওয়া যেত। এখন, Go সময়সূচী অগ্রাধিকার যন্ত্রণা ব্যবস্থা অনুসরণ করে, যাতে দীর্ঘকালীন G গুলি বন্ধ করে অন্য G দেওয়ার জন্য সুযোগ দেওয়া যেতে পারে।

2.3 Goroutine জীবনচক্র পরিচালনা

আপনার Go অ্যাপ্লিকেশানের শক্তিশালী এবং কর্মক্ষমতা নিশ্চিত করতে, Goroutine-এর জীবনচক্র বুঝতে এবং প্রকৃত ভাবে পরিচালনা করতে গুরুত্বপূর্ণ। Goroutines প্রারম্ভ করা সহজ, তবে উচিত পরিচালনা না থাকলে, এগুলি মেমোরি লিক এবং রেস শর্ত সম্পর্কিত সমস্যার সৃষ্টি করতে পারে।

সুরক্ষিতভাবে Goroutines শুরু করা

একটি Goroutine শুরু করার আগে, নিশ্চিত করুন যো এর কার্যকারিতা এবং রানটাইম চরিত্রিক বুঝতে পারেন। একটি Goroutine স্পষ্ট শুরু এবং শেষ থাকতে হবে, "Goroutine অর্ফ্যান" তৈরি করার পরিস্থিতি থেকে বিরতি নিয়োর জন্য।

func worker(done chan bool) {
    fmt.Println("কাজ চলছে...")
    time.Sleep(time.Second) // বাজেটিক কাজ অনুকরণ করা হচ্ছে
    fmt.Println("কাজ শেষ হয়েছে।")
    done <- true
}

func main() {
    // এখানে, Go চ্যানেলের মেকানিজমটি ব্যবহার করা হয়েছে। এটির মাধ্যমে আপনি চ্যানেলকে প্রাথমিক বার্তা কিউ হিসেবে ভাবতে পারেন, এবং বার্তা ডেটা পড়া এবং লেখার জন্য "<-" অপারেটর ব্যবহার করতে পারেন।
    done := make(chan bool, 1)
    go worker(done)
    
    // Goroutine শেষ না হওয়ার জন্য অপেক্ষা করুন
    <-done
}

উপরের কোডটি দেখায় গোরোটিনটি শেষ হওয়ার জন্য done চ্যানেল ব্যবহার করে অপেক্ষা করার একটি উপায়।

লক্ষ্য: এই উদাহরণটি Go-র চ্যানেল ব্যবহার করে, যা পরবর্তী অধ্যায়ে বিস্তারিত হবে।

Goroutines বন্ধ করা

সাধারণভাবে, পূর্নাঙ্গ প্রোগ্রামের শেষ অবশ্যই সবগুলি Goroutines-কে বাতিল করে দেয়। তবে, দীর্ঘকালীন চালু সেবায়, আমরা প্রায়ই Goroutines-কে সক্রিয়ভাবে বন্ধ করতে পারিতে হতে পারে।

  1. চ্যানেল ব্যবহার করে বন্ধ সিগনাল পাঠান: Goroutines চ্যানেলে পরীক্ষা করতে পারে বন্ধ সিগনাল নিয়োর জন্য।
stop := make(chan struct{})

go func() {
    for {
        select {
        case <-stop:
            fmt.Println("বন্ধ সিগনাল পেয়েছি। বন্ধ করা হচ্ছে...")
            return
        default:
            // স্যাবধান অপারেশন চালান
        }
    }
}()

// বন্ধ সিগনাল পাঠানো
stop <- struct{}{}
  1. কনটেক্সট প্যাকেজ ব্যবহার করে জীবনচক্র পরিচালনা করা:
ctx, cancel := context.WithCancel(context.Background())

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("বন্ধ সিগনাল পেয়েছি। বন্ধ করা হচ্ছে...")
            return
        default:
            // স্যাবধান অপারেশন চালান
        }
    }
}(ctx)

// যখন আপনি Goroutine বন্ধ করতে চান
cancel()

কনটেক্সট প্যাকেজ ব্যবহার করা Goroutines-এর ব্যাপক নিয়ন্ত্রন দেয়, সময় সীমা এবং বাতিলের সুযোগ সরবরাহ করে। বড় অ্যাপ্লিকেশন বা মাইক্রোসার্ভিসে, কনটেক্সট Goroutines-এর জীবনচক্র নিয়ন্ত্রণ করার জন্য প্রস্তাবিত উপায় হিসাবে মনোনিবেশ করা হয়।