การปิดงานอย่างราบรื่น
หยุดงานอย่างเรียบร้อย
การปิดงานอย่างราบรื่น เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดเวลาตามเวลา
- ไลบรารี robfig/cron
- ตัวนับเวลาสำหรับช่วงเวลา
- การปิดงานอย่างราบรื่น