Sobes.tech
Junior — Middle

Կարո՞ղ է փոխանցել մի գործառույթ մեկ գորուտինայից մյուսին, որը գտնվում է հանգստի վիճակում։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում, հնարավոր չէ ուղղակի փոխանցել մի գործառույթ մեկ goroutine-ից մյուսին, որը գտնվում է սպասման վիճակում, քանի որ goroutine-ները չունեն ներքին մեխանիզմ փոխանցելու գործառույթները միմյանց միջև:

Այնուամենայնիվ, գործառույթների փոխանցումը կազմակերպելու համար սովորաբար օգտագործվում են ալիքներ (channels): Մեկ goroutine կարող է ուղարկել գործառույթներ ալիքին, իսկ մյուսը՝ ընդունել և կատարել դրանք: Եթե ընդունող goroutine-ը սպասում է, այն կսպասի տվյալների ալիքից և անմիջապես կվերամշակի դրանք ստանալուց հետո:

Օրինակ՝

 tasks := make(chan func())

// Կատարող goroutine
go func() {
    for task := range tasks {
        task() // կատարում է գործառույթը
    }
}()

// Ուղարկող goroutine
tasks <- func() {
    fmt.Println("Գործառույթը ավարտված է")
}

Այսպիսով, գործառույթը փոխանցվում է ալիքով, և սպասող goroutine-ը այն ընդունում և կատարում է։