GoにおけるSelectチャンネルを活用したタスクスケジューリングの実装

Go言語では、select文とチャネルを使用してタスクスケジューリングを実現できます。以下に、select文とチャネルを使用してタスクスケジューリングを実現する方法を示すサンプルコードを示します。

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という2つのチャネルを作成しました。タスクを処理するために3つのワーカーgoroutineを起動します。main関数では、10個のタスクをjobsチャネルに送信してからチャネルを閉じます。次に、forループを使用してresultsチャネルからタスクの結果を読み取って結果を出力します。

worker関数内で、rangeループを使用してjobsチャネルからタスクを受信します。jobsチャネルが閉じられると、ループは自動的に終了します。その後、タスクの実行時間をシミュレートし、タスクの結果に2を乗じ、結果をresultsチャネルに送信します。

selectとchannelを利用することで、非同期的なタスクスケジューリングを実現し、タスクを複数のワーカーゴルーチンに分散させて結果を集約します。

bannerAds