Golang获取goroutine协程的ID号代码示例

本文介绍了一个使用Go语言实现的并发编程示例,通过worker函数和goroutineID展示了如何在多个worker协程中处理作业,getGoroutineID函数用于获取当前协程的ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值