gpt4 book ai didi

go - 如何判断goroutine的栈大小?

转载 作者:IT王子 更新时间:2023-10-29 01:39:52 27 4
gpt4 key购买 nike

我知道 go 例程可以有一些阻塞操作,想知道 goroutine 是否可以像常规函数一样调用用户定义的阻塞函数。用户定义的阻塞函数有几个步骤,如 step1、step2。

换句话说,我想知道我们是否可以在 go 例程中进行嵌套阻塞调用。

更新:

最初的目的是找到 goroutine 使用的堆栈大小,尤其是嵌套阻塞调用。对困惑感到抱歉。感谢回答和评论,我创建了以下具有 100,000 个 goroutine 的函数,它在我的 Ubuntu 桌面上占用了 782MB 的虚拟内存和 416MB 的常驻内存。每个 go 例程堆栈平均为 78KB 内存。这是正确的说法吗?

package main

import (
"fmt"
"time"
)

func f(a int) {
x := f1(a);
f2(x);
}
func f1(a int) int {
r := step("1a", a);
r = step("1b", r);
return 1000 * a;
}
func f2(a int) {
r := step("2a", a);
r = step("2b", r);
}
func step(a string, b int) int{
fmt.Printf("%s %d\n", a, b);
time.Sleep(1000 * time.Second)
return 10 * b;
}

func main() {
for i := 0; i < 100000; i++ {
go f(i);
}
//go f(20);
time.Sleep(1000 * time.Second)
}

最佳答案

我相信你是对的,虽然我不确定“虚拟”和“驻留”内存之间的关系,但可能存在一些重叠。

需要考虑的一些事情:您运行的是 100,000,而不是 10,000。

堆栈本身可能包含用于 printfs、方法参数等的字符串。

从 go 1.2 开始,默认堆栈大小(每个 go 例程)是 8KB这或许可以解释其中的一部分。

从 go 1.3 开始,它还使用 exponentially increasing堆栈大小,但我怀疑这是你遇到的问题。

关于go - 如何判断goroutine的栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25317838/

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