Sobes.tech
Junior — Middle

Көп агымдуу системаларды иштеп чыгууда өзара тоскоолдук маселелерине туш болдуңузбу?

sobes.tech AI

AIден жооп

Ооба, көп иштеген системаларды иштеп чыгууда, мен deadlock (өлүм кагазы) маселеси менен беттешкенмин. Бул — эки же андан көп жиптер дайыма бири-бирин бөгөп, ресурстарды бошотконду күтүп жатышат.

Deadlock-торду алдын алуу үчүн, мен төмөнкү практикаларды колдонуп жатам:

  • Ар дайым бир эле тартипте бир нече блокту алуу.
  • Блокторду кармоо убактысын кыскартуу.
  • Блокту алуу аракетинде тайм-ауттарды колдонуу.
  • Жогорку деңгээлдеги синхрондоштуруу primitives, мисалы, Goдогу каналдар.

Мисал катары, Goдогу жөнөкөй deadlock:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
}

Бул жерде, f1 жана f2 бири-бирин бөгөп калышы мүмкүн, эгерде экөө биринчи mutexти алышып, экинчисин күтүп жатышса. Бул кырдаалды алдын алуу үчүн, mutexтерди алуу тартибин координациялоо керек.