Sobes.tech
Junior — Middle

რის დროს და როგორ შეიძლება თრიდებმა მიმართონ გლობალურ რიგს სამუშაოების მისაღებად და გორუტინების დასაწყებად?

sobes.tech AI

პასუხი AI-სგან

Go-ში, სამუშაო გარემო იყენებს M:N მოდელს, სადაც M არის სისტემის ძაფები (threads), ხოლო N — goroutine-ები. Goroutine-ები პირდაპირ არ არიან დაკავშირებული კონკრეტულ ძაფებთან, არამედ შესრულებულია ძაფების პულში.

გლობალური დავალებების რიგი არის რიგი goroutine-ების, რომლებიც მზად არიან შესრულებისთვის, მაგრამ ჯერ არ არის მინიჭებული კონკრეტულ ძაფს. როდესაც ძაფი თავისუფლდება, ის მიმართავს ამ გლობალურ რიგს, რათა მიიღოს შემდეგი goroutine-ის დაწყება.

ეს დაახლოებით ასე ხდება:

  • როდესაც ქმნიან goroutine-ს (go-ის საშუალებით), ის იდება გლობალურ რიგში.
  • თავისუფალი ძაფი იღებს goroutine-ს გლობალურ რიგიდან და იწყებს მას შესრულებას.
  • თუ ძაფი ვერ პოულობს დავალებებს მისი ადგილობრივი რიგში, ის მიმართავს გლობალურს.

ამ გზით, ძაფები დინამიურად იღებენ დავალებებს გლობალურ რიგიდან და იწყებენ შესაბამის goroutine-ებს, რაც უზრუნველყოფს დატვირთვის ბალანსს და სისტემის რესურსების ეფექტიან გამოყენებას.

სიმპლიფიცირებული მაგალითი:

// რამდენიმე goroutine-ს ქმნით
for i := 0; i < 10; i++ {
    go func(n int) {
        fmt.Println("Goroutine", n)
    }(i)
}

რანტაიმმა ამ goroutine-ებს განათავსა გლობალურ რიგში, ხოლო სისტემის ძაფები იღებენ მათ შესრულებისთვის.