在Go語言中,可以使用select和channel來實現任務調度。下面是一個示例代碼,演示如何使用select和channel來實現任務調度:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Printf("Worker %d started job %d\n", id, job)
time.Sleep(time.Second) // 模擬任務執行時間
fmt.Printf("Worker %d finished job %d\n", id, job)
results <- job * 2 // 將任務結果發送到結果通道
}
}
func main() {
const numJobs = 10
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 啟動多個worker goroutine
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 分發任務到任務通道
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 收集任務結果
for r := 1; r <= numJobs; r++ {
result := <-results
fmt.Println("Result:", result)
}
}
在上述示例中,我們創建了兩個通道jobs和results,jobs通道用于傳遞任務,results通道用于傳遞任務結果。我們啟動了3個worker goroutine來處理任務。在主函數中,我們向jobs通道發送了10個任務,然后關閉該通道。接著,我們使用for循環從results通道中讀取任務結果,并打印出來。
在worker函數中,使用range循環從jobs通道中接收任務,當jobs通道被關閉后,循環會自動退出。然后,我們模擬了任務的執行時間,將任務結果乘以2,并將結果發送到results通道中。
通過使用select和channel,我們可以實現并發式的任務調度,將任務分發給多個worker goroutine并收集任務結果。