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-ը այն ընդունում և կատարում է։