Bagaimana untuk menyelesaikan masalah pemantauan tugas dan pengendalian penggera tugas serentak dalam bahasa Go?
Apabila menggunakan bahasa Go untuk pengaturcaraan serentak, kami sering menghadapi masalah dengan pemantauan tugas dan pengendalian penggera. Tujuan memantau tugasan serentak adalah untuk memahami status pelaksanaan tugas tepat pada masanya, manakala pemprosesan penggera adalah untuk memaklumkan dengan segera apabila keabnormalan berlaku dalam tugas supaya langkah tepat pada masanya dapat diambil. Artikel ini akan memperkenalkan cara menyelesaikan masalah pemantauan tugas dan pengendalian penggera tugas serentak dalam bahasa Go dan memberikan contoh kod khusus.
1. Pemantauan tugas
#🎜🎜 #Bahasa Go menyediakan pelbagai cara untuk memantau pelaksanaan tugasan Beberapa kaedah biasa akan diperkenalkan di bawah.package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { numTasks := 5 // 设置计数器的值为任务的数量 wg.Add(numTasks) // 启动多个任务 for i := 0; i < numTasks; i++ { go processTask(i) } // 等待所有任务完成 wg.Wait() fmt.Println("All tasks completed!") } func processTask(taskNum int) { fmt.Println("Task", taskNum, "started") // 模拟任务的耗时操作 // ... fmt.Println("Task", taskNum, "completed") // 任务完成,计数器减1 wg.Done() }
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { numTasks := 5 // 创建一个通道用于监控任务的完成情况 doneCh := make(chan struct{}) // 启动多个任务 for i := 0; i < numTasks; i++ { wg.Add(1) go processTask(i, doneCh) } // 等待所有任务完成 wg.Wait() fmt.Println("All tasks completed!") } func processTask(taskNum int, doneCh chan struct{}) { fmt.Println("Task", taskNum, "started") // 模拟任务的耗时操作 // ... fmt.Println("Task", taskNum, "completed") // 任务完成,向通道发送信号 doneCh <- struct{}{} // 任务完成,计数器减1 wg.Done() }
Gunakan saluran untuk menghantar maklumat ralat
package main import ( "fmt" "sync" ) type ErrorInfo struct { TaskNum int Message string } var wg sync.WaitGroup func main() { numTasks := 5 // 创建一个通道用于传递错误信息 errorCh := make(chan ErrorInfo) // 启动多个任务 for i := 0; i < numTasks; i++ { wg.Add(1) go processTask(i, errorCh) } // 等待所有任务完成 wg.Wait() // 关闭通道,防止死锁 close(errorCh) // 处理错误信息 for err := range errorCh { fmt.Printf("Task %d error: %s ", err.TaskNum, err.Message) // 进行报警处理 // ... } fmt.Println("All tasks completed!") } func processTask(taskNum int, errorCh chan ErrorInfo) { fmt.Println("Task", taskNum, "started") // 模拟任务的耗时操作 // ... // 任务出现异常,向通道发送错误信息 errorCh <- ErrorInfo{ TaskNum: taskNum, Message: "Task encountered an error", } fmt.Println("Task", taskNum, "completed") // 任务完成,计数器减1 wg.Done() }
Gunakan pernyataan pilihan untuk mendengar berbilang saluran
#🎜🎜 ##🎜 🎜#Semasa proses pemprosesan penggera, mungkin perlu memantau berbilang saluran pada masa yang sama untuk mengendalikan acara yang berbeza tepat pada masanya. Anda boleh menggunakan penyataan pilih bahasa Go untuk memantau berbilang saluran Setelah peristiwa berlaku, kendalikannya dengan sewajarnya.package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { numTasks := 5 // 创建一个通道用于传递错误信息 errorCh := make(chan int) // 创建一个通道用于定时器事件 ticker := time.NewTicker(time.Second) // 启动多个任务 for i := 0; i < numTasks; i++ { wg.Add(1) go processTask(i, errorCh) } // 启动报警处理协程 go alertHandler(errorCh, ticker) // 等待所有任务完成 wg.Wait() fmt.Println("All tasks completed!") } func processTask(taskNum int, errorCh chan int) { fmt.Println("Task", taskNum, "started") // 模拟任务的耗时操作 // ... // 任务出现异常,向通道发送错误信息 if taskNum == 3 { errorCh <- taskNum } fmt.Println("Task", taskNum, "completed") // 任务完成,计数器减1 wg.Done() } func alertHandler(errorCh chan int, ticker *time.Ticker) { for { select { case taskNum := <-errorCh: fmt.Printf("Task %d encountered an error! ", taskNum) // 进行报警处理 // ... case <-ticker.C: fmt.Println("Tick") // 定时器事件处理 // ... } } }
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pemantauan tugas dan pengendalian penggera tugas serentak dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!