package main
import (
"fmt"
"runtime"
)
type Job struct {
ID int
Msg string
}
type Result struct {
JobID int
Msg string
}
func worker(jobs <-chan Job, results chan<- Result) {
for job := range jobs {
// 获取当前协程的ID
workerID := getGoroutineID()
// 进行作业处理
fmt.Printf("Worker %d processing Job %d with message: %s\n", workerID, job.ID, job.Msg)
// 模拟处理耗时
// time.Sleep(time.Second)
// 发送处理结果到结果通道
result := Result{
JobID: job.ID,
Msg: fmt.Sprintf("Result from Worker %d", workerID),
}
results <- result
}
}
func getGoroutineID() int {
var buf [64]byte
runtime.Stack(buf[:], false)
var id int
fmt.Sscanf(string(buf[:]), "goroutine %d", &id)
return id
}
func main() {
numJobs := 5
jobs := make(chan Job, numJobs)
results := make(chan Result, numJobs)
// 启动并发的 worker 协程
for i := 1; i <= 3; i++ {
go worker(jobs, results)
}
// 发送作业到作业通道
for i := 1; i <= numJobs; i++ {
job := Job{
ID: i,
Msg: fmt.Sprintf("Job %d", i),
}
jobs <- job
}
close(jobs)
// 接收处理结果
for i := 1; i <= numJobs; i++ {
result := <-results
fmt.Printf("Received result for Job %d: %s\n", result.JobID, result.Msg)
}
}
上述代码中,worker
函数使用getGoroutineID
函数获取当前协程的ID,并在处理作业时打印协程ID。getGoroutineID
函数使用runtime.Stack
函数获取当前协程的堆栈信息,并从中解析出协程ID。
在main
函数中,我们启动了三个并发的worker
协程来处理作业。每个worker
协程都会打印其协程ID,以便你可以观察到不同协程的工作情况。
请注意,协程ID的打印顺序可能会因为并发执行而有所不同,因此输出结果的顺序可能会有所变化。