முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 7 · பாடம் 1 இன் 5பாடத்திட்டத்தில் 31/50~12 min
தொகுதி பாடங்கள் (1/5)

Goroutines: இலகுரக பேரலலிசம்

A goroutine என்பது Go ஆல் நிர்வகிக்கப்படும் ஒரே நேரத்தில் செயல்படுத்தும் அலகு ஆகும் இயக்க நேரம். செயல்பாட்டின் முன் go முக்கிய சொல்லுடன் ஒன்றைத் தொடங்குகிறீர்கள் அழைப்பு:

Go
go greet("Anna")         // chiamata a funzione esistente
go func() {              // funzione anonima
    fmt.Println("hi")
}()

go அறிக்கை உடனடியாக: goroutine தொடங்குகிறது இணையாக மற்றும் அழைப்பவர் தொடர்ந்து செல்கிறார்.

அவை ஏன் "இலகுரக"

  • இனிஷியல் ஸ்டாக் ~2KB (தேவைப்பட்டால் நூற்றுக்கணக்கான எம்பி வரை மாறும்).
  • மல்டிப்ளெக்ஸ் இயக்க நேரத்தின்படி குறைந்த எண்ணிக்கையிலான OS த்ரெட்களில் (GOMAXPROCS).
  • ஆயிரக்கணக்கான/மில்லியன் கோருட்டீன்கள் வழக்கமானவை; OS நூல்கள் மூலம் அவை சாத்தியமற்றதாக இருக்கும்.

கருத்துரீதியாக இது "ஒரே நேரத்தில் தீ மற்றும் மறந்து", ஆனால் அனைத்து ஒருங்கிணைக்க மொழியியல் கருவிகள் (சேனல்கள், sync.WaitGroup, context).

முக்கிய காத்திருக்கவில்லை

Go
func main() {
    go func() { fmt.Println("ciao dalla goroutine") }()
    // main esce subito: niente garanzia che la goroutine completi
}

main திரும்பும்போது, செயல்முறை முடிவடைகிறது: goroutines பெறவில்லை "தங்கள் வேலையை முடிக்க", அவர்கள் வெறுமனே ஒன்றாக கொல்லப்படுகிறார்கள் செயல்முறை. வெளிப்படையான ஒத்திசைவு தேவை.

ஒத்திசைவு: ஒரு முன்னோட்டம்

அடுத்த பாடங்களில் நீங்கள் பார்க்கும் மூன்று கருவிகள்:

Go
// 1) Channel: la goroutine "segnala" via canale
done := make(chan struct{})
go func() {
    work()
    done <- struct{}{}
}()
<-done   // attendi

// 2) sync.WaitGroup: N goroutine
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); work() }()
wg.Wait()

// 3) context: cancellazione/timeout propagati

"கிளாசிக்" க்ளோசர்-இன்-லூப் பிழை

கோ 1.21 வரை இது அடிக்கடி கேட்கப்பட்டது:

Go
for i := 0; i < 3; i++ {
    go func() { fmt.Println(i) }()  // stampa "3 3 3" su versioni vecchie
}

Go 1.22 இலிருந்து for மாறி ஒவ்வொன்றிலும் புதிதாக உருவாக்கப்பட்டது மறு செய்கை, எனவே பிழை இயல்பாகவே சரி செய்யப்பட்டது. பழைய கோட்பேஸ்களில் நீங்கள் செய்வீர்கள் இன்னும் சரிசெய்தல் வடிவத்தைக் காண்க:

Go
for i := 0; i < 3; i++ {
    i := i           // shadow esplicito
    go func() { fmt.Println(i) }()
}
// oppure passa come argomento:
for i := 0; i < 3; i++ {
    go func(n int) { fmt.Println(n) }(i)
}

Goroutine != OS நூல்

அம்சம்GoroutineOS நூல்
ஆரம்ப அடுக்கு~2 KB1–8 எம்பி (தொடக்கத்தில் ஒதுக்கப்பட்டது)
உருவாக்கம்நானோ விநாடிகள்மைக்ரோ விநாடிகள்
திட்டமிடல்கோ இயக்க நேரம் (கூட்டுறவு)கர்னல் (முன்கூட்டி)
நடைமுறை எண்ணிக்கை100K+சில ஆயிரம்

ஒரு OS நூல் பல goroutineகளை ஹோஸ்ட் செய்யலாம். இயக்க நேரம் நகர்கிறது தேவைப்படும் போது நூல் முழுவதும் goroutines.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m7.l1.e1
முயற்சிகள்: 0ஏற்றுகிறது…

வாழ்த்துச் செயல்பாட்டை ஒரு கோரூட்டினாகத் தொடங்கி, நேரத்துடன் 100 மி.க்கள் காத்திருக்கவும். பிரதானமாக வெளியேறும் முன் தூங்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

ஒரு செயல்பாட்டு அழைப்பின் முன் `go` goroutine ஐத் துவக்குகிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m7.l1.e2
முயற்சிகள்: 0ஏற்றுகிறது…

'ஹாய்' என்று அச்சிடும் ஒரு அநாமதேய செயல்பாட்டை ஒரு கோரூட்டினாகத் தொடங்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

அநாமதேய செயல்பாடு `()`: `go func(){...}()`.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m7.l1.e3
தயார்

ஒரு goroutine முடிவதற்குள் `main` வெளியேறினால் என்ன நடக்கும்?

Go
func main() {
  go work()
  // main ritorna immediatamente
}
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • go f() f()ஐ ஒரே நேரத்தில் துவக்குகிறது; அது உடனடியாக திரும்பும்.
  • Goroutine = ~2 KB இன்ஷியல், ஒரு சில OS த்ரெட்களில் மல்டிபிளக்ஸ் செய்யப்பட்டது.
  • main காத்திருக்கவில்லை: உங்களுக்கு ஒத்திசைவு தேவை (channel/WaitGroup/context).
  • time.Sleep என்பது செயற்கையான செயல் மட்டுமே, தயாரிப்பில் ஒத்திசைக்கப்படாது.
  • Go 1.22 இலிருந்து for மாறி ஒவ்வொரு மறு செய்கையிலும் "புதியது" (இனி "3 3 3" பிழை இல்லை).