Sobes.tech
Middle — Middle+

Раванди амалҳоро барои боздошти дурустии барнома бе аз даст додани маълумот ё хатогӣ чӣ гуна аст?

sobes.tech AI

Ҷавоб аз AI

Барои ба таври дуруст боздоштанӣ кардани барномаи Go бидуни талафоти маълумот ва хатогӣ, одатан қадамҳои зеринро иҷро мекунанд:

  1. Ҳамоҳангсозии сигнали системаи оператсионӣ — сигнали қатъро (SIGINT, SIGTERM) бо истифода аз канал ва signal.Notify мегиранд.

  2. Шурӯъ кардани shutdown-и нарм (graceful shutdown) — раванди сабукро барои қатъ кардани қабул кардани дархостҳои нав ва иҷозат додан ба анҷоми дархостҳои мавҷуда оғоз мекунанд.

  3. Бекор кардани контекст — бо истифода аз context.Context бо бекор кардан, сигнали боздоштиро ба ҳамаи goroutine-ҳо мефиристанд.

  4. Баста кардани захираҳо — пайвастагиҳои кушод ба базаи маълумот, файлҳо, пайвастагиҳои шабакавиро мебанданд.

  5. Чекор кардани анҷоми goroutine-ҳо — бо истифода аз sync.WaitGroup ё дигар механизмҳо интизор мешаванд, ки ҳама амалҳо ба охир расанд.

Масалан, ҳангоми коркарди сигнал ва shutdown-и нарм:

import (
    "context"
    "os"
    "os/signal"
    "sync"
    "syscall"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    // оғоз кардани барнома
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // функсияи асосӣ
    }()

    // коркарди сигналар
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    <-sigs // интизор шудан барои сигнали
    cancel() // бекор кардани контекст, сигнали goroutine-ҳоро

    // интизор шудан барои анҷом
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // ҳама анҷом ёфтанд
    case <-time.After(10 * time.Second):
        // вақти интизорӣ тамом шуд
    }
}

Ин усул кӯмак мекунад, ки талафоти маълумот пешгирӣ шавад ва ба таври нодуруст ба анҷом расидани барнома роҳ надиҳад.