0Pricing
Go Academy · บทเรียน

การปิดงานอย่างราบรื่น

หยุดงานอย่างเรียบร้อย

การปิดงานอย่างราบรื่น เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

การหยุดงานอย่างเรียบร้อย

ตัวจัดตารางเวลาที่ถูกหยุดระหว่างงานอาจทำให้ข้อมูลเสียหายหรือทิ้งงานที่ทำเสร็จเพียงบางส่วนไว้ การปิดระบบอย่างเรียบร้อย หมายถึง หยุดรับการทำงานรอบใหม่ ปล่อยให้งานที่กำลังทำอยู่เสร็จสิ้นภายในกำหนดเวลา แล้วจึงออกจากการทำงาน

การรับฟังสัญญาณ

รับสัญญาณจาก OS เช่น SIGINT (Ctrl+C) และ SIGTERM (คำสั่งหยุดจากตัวจัดการระบบ) เพื่อให้คุณปิดระบบได้ตามต้องการ

sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
fmt.Println("shutting down")

signal.NotifyContext

Go 1.16 ขึ้นไปมีตัวช่วยที่กระชับ ซึ่งจะยกเลิกบริบทเมื่อมีสัญญาณเข้ามา

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
<-ctx.Done()

การหยุดตัวจัดตารางเวลา

สำหรับ robfig/cron, c.Stop() จะส่งคืนบริบทที่เสร็จสิ้นเมื่อ งานที่กำลังทำอยู่ทั้งหมดเสร็จสิ้นแล้ว ให้รอบนบริบทนี้เพื่อระบายงานที่ค้างอยู่

ctx := c.Stop()        // stops scheduling, returns ctx
<-ctx.Done()            // wait for running jobs
fmt.Println("all jobs finished")

ส่งต่อการยกเลิกไปยังงาน

ส่งบริบทเข้าไปในแต่ละงาน เพื่อให้งานที่ทำงานเป็นเวลานานสามารถยุติได้ทันทีเมื่อเริ่มปิดระบบ

func job(ctx context.Context) {
    select {
    case <-time.After(time.Hour):
    case <-ctx.Done():
        return // bail out early
    }
}

กำหนดขอบเขตเวลารอ

อย่ารอให้งานที่ติดค้างเสร็จสิ้นตลอดไป ใช้บริบทที่มีการหมดเวลา เพื่อให้การปิดระบบเสร็จสิ้นแม้งานจะค้างอยู่

shutCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

WaitGroups สำหรับตัวจัดตารางเวลาแบบกำหนดเอง

หากคุณสร้างตัวจัดตารางเวลาเองด้วยโกโรทีน ให้ติดตามโกโรทีนเหล่านั้นด้วย sync.WaitGroup และเรียก Wait() ระหว่างการปิดระบบ

var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); doWork() }()
// shutdown:
wg.Wait()

หลีกเลี่ยงการเริ่มงานใหม่

เมื่อเริ่มปิดระบบแล้ว ตัวส่งสัญญาณตามช่วงเวลาหรือ cron ต้องหยุดส่งสัญญาณ การปิดช่องสัญญาณเสร็จสิ้นหรือการยกเลิกบริบทจะทำให้ลูปรับรู้สัญญาณและหยุดจัดตารางการทำงานรอบใหม่

ความสามารถในการทำซ้ำอย่างปลอดภัยช่วยได้

ออกแบบงานให้สามารถทำซ้ำได้อย่างปลอดภัย หากงานถูกหยุดกลางคันและทำซ้ำหลังเริ่มระบบใหม่ ตรรกะที่ทำซ้ำได้โดยไม่เกิดผลซ้ำจะช่วยหลีกเลี่ยงผลกระทบซ้ำซ้อน เช่น การส่งอีเมลซ้ำหรือเรียกเก็บเงินซ้ำ

รูปแบบทั้งหมด

เมื่อนำทุกอย่างมาประกอบกัน จะมีบริบทที่แจ้งเตือนเมื่อมีสัญญาณ การหยุด cron ที่ส่งคืนบริบทสำหรับระบายงาน และการหมดเวลาที่มีขอบเขต นี่คือโครงร่างมาตรฐานสำหรับการปิดบริการที่จัดตารางไว้อย่างเรียบร้อย

ตัวอย่างที่เรียกใช้ได้: หยุดอย่างเรียบร้อยด้วยบริบท

โปรแกรมแบบทำงานได้ในตัวนี้เรียกใช้งานเป็นระยะ และหยุดอย่างเรียบร้อยผ่านการยกเลิกบริบท โดยรอให้สัญญาณที่กำลังทำงานอยู่เสร็จสิ้น

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        t := time.NewTicker(5 * time.Millisecond)
        defer t.Stop()
        for {
            select {
            case <-t.C:
                fmt.Println("working")
            case <-ctx.Done():
                fmt.Println("stopping cleanly")
                return
            }
        }
    }()
    time.Sleep(17 * time.Millisecond)
    cancel()   // signal shutdown
    wg.Wait()  // wait for worker to finish
    fmt.Println("shutdown complete")
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการหยุดงานอย่างเรียบร้อย

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับการหยุดงานอย่างเรียบร้อย:

  • รับ SIGINT/SIGTERM โดยควรใช้ signal.NotifyContext
  • cron.Stop() ส่งคืนบริบทที่ระบายงานที่กำลังทำอยู่
  • ส่งต่อบริบทเข้าไปในงานและกำหนดขอบเขตเวลารอด้วยการหมดเวลา
  • ทำให้งานสามารถทำซ้ำได้อย่างปลอดภัย เพื่อให้การทำซ้ำหลังเกิดข้อผิดพลาดปลอดภัย

คำถามที่พบบ่อย

บทเรียน “การปิดงานอย่างราบรื่น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การปิดงานอย่างราบรื่น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การปิดงานอย่างราบรื่น”

หยุดงานอย่างเรียบร้อย คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การปิดงานอย่างราบรื่น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเวลาตามเวลา
  2. ไลบรารี robfig/cron
  3. ตัวนับเวลาสำหรับช่วงเวลา
  4. การปิดงานอย่างราบรื่น
← กลับไปที่ Go Academy