Sobes.tech
Middle — Middle+

Xizmat yoki ilovani yumshoq to'xtatishni qanday amalga oshirasiz, hozirgi holatni saqlash va ma'lumotlarni yo'qotmasdan yakunlash uchun?

sobes.tech AI

AIdan javob

Go tilida xizmat yoki ilovani yumshoq to'xtatish uchun odatda operatsion tizim signallarini (masalan, SIGINT, SIGTERM) va bekor qilish kontekstini (context.Context) ishlatishadi. Bu joriy operatsiyalarni to'g'ri yakunlash, holatni saqlash va resurslarni bo'shatish imkonini beradi.

Misol:

package main

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    // Yumshoq to'xtash uchun signalni boshqarish
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("To'xtash signali olindi, yopilish boshlanmoqda...")
        cancel() // Kontekstni bekor qilish
    }()

    // Asosiy mantiqni bekor qilish bilan ishga tushirish
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Holatni saqlash, resurslarni bo'shatish
            fmt.Println("Holatni saqlash va yopish")
            time.Sleep(2 * time.Second) // simulyatsiya
            return
        default:
            // Asosiy ish
            fmt.Println("Ishlamoqda...")
            time.Sleep(1 * time.Second)
        }
    }
}

Ushbu yondashuv ishni to'g'ri yakunlash, ma'lumotlarni yo'qotmaslik va operatsiyalarni majburan to'xtatmaslik imkonini beradi.