Golang获取goroutine协程的ID号代码示例
  0SnbOly3LC5t 2023年11月19日 36 0


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的打印顺序可能会因为并发执行而有所不同,因此输出结果的顺序可能会有所变化。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
0SnbOly3LC5t