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 მას იღებს და ასრულებს.