gpt4 book ai didi

go - 如何识别一个goroutine?

转载 作者:IT王子 更新时间:2023-10-29 00:44:12 24 4
gpt4 key购买 nike

假设我有一堆 goroutines 的堆栈跟踪,e。例如:

goroutine 5633 [select]:
net/http.(*persistConn).writeLoop(0xc21303ac00)
/usr/lib/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
/usr/lib/go/src/pkg/net/http/transport.go:529 +0x61e

在我的例子中,一个独特的特定于应用程序的对象由一组 goroutines 提供服务,我想查看与特定对象相关的 goroutines 的堆栈跟踪。我有数百个特定于应用程序的对象,所以我得到了数百个相同的 goroutine。

我如何将我的日志与堆栈跟踪中的 goroutine 相关联?似乎没有办法在堆栈跟踪中识别当前的 goroutine,也没有办法命名 goroutine,所以我可以在堆栈跟踪中看到特定的值。

附言

我已经在 Go 邮件列表上阅读了相关的 why-would-you-want-to-do-it 帖子,所以我正在寻找替代方案/hacks/workarounds(希望不涉及散布代码每隔一行调用一个日志)。

最佳答案

A workaround是可能的,并且涉及一小段 C 代码。

goid.c

#include <runtime.h>
void ·GetGoID(int32 ret) {
ret = g->goid;
USED(&ret);
}

main.go

package main
import (
"fmt"
"sync"
)
// Declaration is required
func GetGoID() int32
func main() {
var wg sync.WaitGroup
f := func() {
wg.Add(1)
go func() {
fmt.Printf("goroutine %d\n", GetGoID())
wg.Done()
}()
}
for i := 0; i < 10; i++ {
f()
}
wg.Wait()
}

构建并运行

$ go build
$ ./example
goroutine 20
goroutine 21
goroutine 22
goroutine 23
goroutine 24
goroutine 25
goroutine 26
goroutine 27
goroutine 28
goroutine 29

关于go - 如何识别一个goroutine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com