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.