时间。睡眠会阻止goroutine吗?

时间。睡眠会阻止goroutine吗?,go,Go,我有下一个代码: par.go package main import ( "runtime"; "time" ) func main() { runtime.GOMAXPROCS(4) ch := make(chan int) n := 1 for i := 0; i < n; i++ { go func() { time.Sleep(60 * time.S

我有下一个代码:

par.go

package main

import (
    "runtime";
    "time"
)

func main() {
    runtime.GOMAXPROCS(4)
    ch := make(chan int)
    n := 1
    for i := 0; i < n; i++ {
        go func() {
            time.Sleep(60 * time.Second)
            ch <- 1
        }();
    }
    for i := 0; i < n; i++ {
        <-ch
    }
}
然后,确认此进程中有多少线程:

$ ps -ef | grep par
shubunt+  3670 32131  0 12:35 pts/0    00:00:00 ./par
$ cat /proc/3670/status | grep -i threads
Threads:        5
你可以看到有5个线程

如果我在代码中更改
n
的值,则情况如下:

n := 100, Threads is 8
n := 10000, Threads is 9
n := 100000, Threads is 9
n := 1000000, Threads is 9
n := 2000000, Threads is 10
我知道,go调度器遵循
MPG
模型,这里
p=4
,所以
M=4
M
1:1
KSE
(内核线程)。如果任何goroutine处于任何阻塞状态,
P
将从当前的
M
中分离,如果找不到,则查找空闲的
M
或新的
M

所以,我的问题是:
time.Sleep
真的阻止了goroutine吗?如果不是,当我将
n
的值从
1
增加到
2000000
时,为什么会出现新线程?如果是的,那里有
60秒
,为什么要新建一点
M
,我希望那里有很多新线程

更新:

package main

import (
    "io/ioutil"
    "os"
    "runtime"
    "strconv"
)

func main() {
    runtime.GOMAXPROCS(2)
    data := make([]byte, 128*1024*1024)
    for i := 0; i < 200; i++ {
        go func(n int) {
            for {
                err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)
                if err != nil {
                    println(err)
                    break
                }
            }
        }(i)
    }
    select {}
}
从中添加另一个示例

测试。转到:

package main

import (
    "io/ioutil"
    "os"
    "runtime"
    "strconv"
)

func main() {
    runtime.GOMAXPROCS(2)
    data := make([]byte, 128*1024*1024)
    for i := 0; i < 200; i++ {
        go func(n int) {
            for {
                err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)
                if err != nil {
                    println(err)
                    break
                }
            }
        }(i)
    }
    select {}
}
主程序包
进口(
“io/ioutil”
“操作系统”
“运行时”
“strconv”
)
func main(){
runtime.GOMAXPROCS(2)
数据:=生成([]字节,128*1024*1024)
对于i:=0;i<200;i++{
go func(n int){
为了{
err:=ioutil.WriteFile(“testxxx”+strconv.Itoa(n),[]字节(数据),os.ModePerm)
如果错误!=零{
println(err)
打破
}
}
}(一)
}
选择{}
}
如果不使用
Sleep
,请使用real IO,我的机器上的线程数将为
202

所以,我的问题也与上面两个例子的不同有关,我什么时候应该担心调度器为我生成太多的内核线程

[一] 是时候了。睡眠真的阻碍了goroutine吗

但是goroutine实际上是如何调度到线程的是a)复杂的,b)在每个版本中都不同,c)在不同的体系结构中可能不同,d)语言没有指定。而“MPG模型”是一个精确的模型,如果调度器是如何工作的,那么它只是一个模型

如果调度程序确定10个线程足以不运行200000个goroutines,因为它们都是
时间。Sleep
ing,那么10个线程就足够了

基本上,在围棋中没有什么需要担心或思考的东西(与其他语言形成鲜明对比,在其他语言中,对这些特性必须非常小心)。“阻塞”只是意味着下一条语句无法立即执行,因为实际语句尚未完成。如果原因从时间到睡眠什么都不做,除了等待、等待形成RAM、等待磁盘或等待网络数据,这种情况可能会发生过多。以相同的方式处理所有这些将简化调度程序,但使其成为一个糟糕的调度程序。所以,不,时间。睡眠并不会阻止我们的狂欢。问题是“block goroutine”并没有明确的含义。它不需要被定义为没有什么有趣的事情要知道

更新:

[W] 什么时候我应该担心调度器为我生成太多的内核线程

从来没有

有两种不同的场景:a)编写正常、合理的生产代码和B)编写手工编写的代码,这些代码经过精心设计,可以创建大量线程,这些线程都在磁盘IO中等待完成。当然,您可以故意欺骗调度程序和操作系统,并想出一个病态的程序来创建太多的线程(调度程序可能被欺骗的这个问题是问题4056中的地址),但这并不需要担心。只是不要故意做傻事


有很多方法可以欺骗你的电脑。编写快速代码是一种方法。种族检测器有助于识别他们。在写之前担心种族状况是一件好事(就像这样)。可能会创建太多线程,您可以向操作系统询问线程数。在不太可能的情况下,有太多:修复它。但这不太可能。这有点像OOM错误:编写OOM的代码非常简单,但在编写代码时无需经常担心OOM。如果您的经验表明您需要重新设计OOM,但您并没有通过担心OOM以及您需要了解的OOM、如何防止OOM以及如何处理OOM来启动任何琐碎的项目。除非你已经知道你的数据占用了很多内存。此处相同:如果您知道您的代码将执行大量并发磁盘IO,并且这是域固有的,那么您可能会担心这一点,并在代码中处理这一点,但每种语言的技术都是相同的。

总结我对这个问题的最终理解,以防有人感兴趣:

  • 对于
    time.Sleep
    ,如果我设置启动20个goroutines,接下来是
    delve
    的结果:

     ./dlv attach 2070
     Type 'help' for list of commands.
     (dlv) threads
     * Thread 2070 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2071 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2072 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2092 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2093 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
     (dlv) grs
       Goroutine 1 - User: /home/shubuntu1/gotrial/new/par.go:19 main.main (0x452686)
       Goroutine 2 - User: /usr/lib/go-1.12/src/runtime/proc.go:302    runtime.gopark (0x425f3f)
       Goroutine 3 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x425f3f)
       Goroutine 4 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 5 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 6 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 7 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 8 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 9 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 10 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 11 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 12 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 13 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 14 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 15 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 16 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 17 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 18 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 19 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 20 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 21 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 22 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 23 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
     * Goroutine 24 - User: /usr/lib/go-1.12/src/runtime/lock_futex.go:228 runtime.notetsleepg (0x409064)
     [24 goroutines]
    
     ./dlv attach 2455
     Type 'help' for list of commands.
     (dlv) threads
     * Thread 2455 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2456 at 0x4530f3 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2457 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2458 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2459 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2460 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2461 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2462 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2463 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2464 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2465 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2466 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2468 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2469 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2470 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2471 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2472 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2473 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2474 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2475 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2476 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2477 at 0x4530f3 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
     (dlv) grs
       Goroutine 1 - User: /home/shubuntu1/gotrial/newnew/test.go:24 main.main (0x4754b0)
       Goroutine 2 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 3 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 4 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 5 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 6 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 7 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2457)
       Goroutine 8 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2476)
       Goroutine 9 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2461)
       Goroutine 10 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2473)
       Goroutine 11 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2468)
       Goroutine 12 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2469)
     * Goroutine 13 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2455)
       Goroutine 14 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2459)
       Goroutine 15 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2460)
       Goroutine 16 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2471)
       Goroutine 17 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2464)
       Goroutine 18 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2462)
       Goroutine 19 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2466)
       Goroutine 20 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2474)
       Goroutine 21 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2470)
       Goroutine 22 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2463)
       Goroutine 23 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2472)
       Goroutine 24 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2458)
       Goroutine 25 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2475)
       Goroutine 26 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2465)
     [26 goroutines]
     (dlv)
    
    您可以看到,在
    时间内有许多goroutine.Sleep
    而只有一些线程,这些线程正在运行
    runtime.futex

    此外,我们还可以知道,
    golang sleep
    将涉及一个
    lock
    ,因此这可能是一些额外线程启动的原因,但是锁很快就被释放了,因此那里没有那么多线程,许多goroutine仍然可以重用同一个线程

  • 对于
    ioutil.WriteFile
    ,如果我设置为启动20个goroutines,接下来是
    delve
    的结果:

     ./dlv attach 2070
     Type 'help' for list of commands.
     (dlv) threads
     * Thread 2070 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2071 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2072 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2092 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2093 at 0x44d003 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
     (dlv) grs
       Goroutine 1 - User: /home/shubuntu1/gotrial/new/par.go:19 main.main (0x452686)
       Goroutine 2 - User: /usr/lib/go-1.12/src/runtime/proc.go:302    runtime.gopark (0x425f3f)
       Goroutine 3 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x425f3f)
       Goroutine 4 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 5 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 6 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 7 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 8 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 9 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 10 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 11 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 12 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 13 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 14 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 15 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 16 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 17 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 18 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 19 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 20 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 21 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 22 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
       Goroutine 23 - User: /usr/lib/go-1.12/src/runtime/proc.go:307 time.Sleep (0x43cc69)
     * Goroutine 24 - User: /usr/lib/go-1.12/src/runtime/lock_futex.go:228 runtime.notetsleepg (0x409064)
     [24 goroutines]
    
     ./dlv attach 2455
     Type 'help' for list of commands.
     (dlv) threads
     * Thread 2455 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2456 at 0x4530f3 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
       Thread 2457 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2458 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2459 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2460 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2461 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2462 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2463 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2464 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2465 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2466 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2468 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2469 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2470 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2471 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2472 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2473 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2474 at 0x460e90 /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall
       Thread 2475 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2476 at 0x460f0a /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6
       Thread 2477 at 0x4530f3 /usr/lib/go-1.12/src/runtime/sys_linux_amd64.s:536 runtime.futex
     (dlv) grs
       Goroutine 1 - User: /home/shubuntu1/gotrial/newnew/test.go:24 main.main (0x4754b0)
       Goroutine 2 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 3 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 4 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 5 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 6 - User: /usr/lib/go-1.12/src/runtime/proc.go:302 runtime.gopark (0x429d9f)
       Goroutine 7 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2457)
       Goroutine 8 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2476)
       Goroutine 9 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2461)
       Goroutine 10 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2473)
       Goroutine 11 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2468)
       Goroutine 12 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2469)
     * Goroutine 13 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2455)
       Goroutine 14 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2459)
       Goroutine 15 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2460)
       Goroutine 16 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2471)
       Goroutine 17 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2464)
       Goroutine 18 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2462)
       Goroutine 19 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2466)
       Goroutine 20 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2474)
       Goroutine 21 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2470)
       Goroutine 22 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2463)
       Goroutine 23 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2472)
       Goroutine 24 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2458)
       Goroutine 25 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:53 syscall.Syscall6 (0x460f0a) (thread 2475)
       Goroutine 26 - User: /usr/lib/go-1.12/src/syscall/asm_linux_amd64.s:27 syscall.Syscall (0x460e90) (thread 2465)
     [26 goroutines]
     (dlv)
    
    您可以看到,在
    syscall
    的过程中有许多goroutine,而在
    syscall
    中也有许多线程,不像
    runtime.futex中的
    sleep
    那样只涉及锁。
    ioutil
    涉及实块系统调用。这是因为epoll不适用于linux上的常规文件,所以不像network io那样具有网络轮询器句柄阻塞接口和非阻塞低级系统调用,请参阅

    所以,我想如果我们不能承受太多的线程