【发布时间】:2020-03-03 15:38:14
【问题描述】:
我知道 goroutine 可以有一些阻塞动作,想知道 goroutine 是否可以像普通函数一样调用用户定义的阻塞函数。用户定义的阻塞函数有几个步骤,例如 step1、step2。
换句话说,我想知道我们是否可以在 go 例程中嵌套阻塞调用。
更新:
最初的意图是找到 goroutine 使用的堆栈大小,尤其是嵌套阻塞调用。对困惑感到抱歉。感谢答案和 cmets,我在我的 Ubuntu 桌面上创建了以下具有 100,000 个 goroutines 的函数,它占用了 782MB 的虚拟内存和 416MB 的驻留内存。每个 goroutine 堆栈平均有 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)
}
【问题讨论】:
-
我建议您完成一些基本教程。 goroutine 的全部意义在于异步执行“阻塞”代码。