Sobes.tech
Middle — Middle+

Hizmet veya uygulamayı mevcut durumu kaydetmek ve veri kaybı olmadan sonlandırmak için nasıl yumuşak bir durdurma gerçekleştiriyorsun?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go dilinde bir hizmetin veya uygulamanın yumuşak şekilde durdurulmasını sağlamak için genellikle işletim sistemi sinyallerinin (örneğin, SIGINT, SIGTERM) işlenmesi ve iptal edilebilir bir bağlam (context.Context) kullanılır. Bu, mevcut işlemlerin düzgün şekilde tamamlanmasını, durumu kaydetmeyi ve kaynakları serbest bırakmayı sağlar.

Örnek:

package main

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

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

    // Yumuşak durdurma için sinyal işleme
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Durdurma sinyali alındı, kapanış başlatılıyor...")
        cancel() // Bağlamı iptal et
    }()

    // İptal desteği ile ana mantığı çalıştır
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Durumu kaydet, kaynakları serbest bırak
            fmt.Println("Durumu kaydet ve kapat")
            time.Sleep(2 * time.Second) // simülasyon
            return
        default:
            // Ana iş
            fmt.Println("Çalışıyor...")
            time.Sleep(1 * time.Second)
        }
    }
}

Bu yaklaşım, işi düzgün şekilde sonlandırmaya, veri kaybını önlemeye ve işlemleri zorla kesintiye uğratmamaya olanak tanır.