【发布时间】:2017-11-24 03:54:55
【问题描述】:
golang应用程序是一个通过调用c库接收文件,保存到磁盘并报告传输状态以http协议监控服务的工具。
经过几次传输,我发现大约有 70 多个线程存在几个 goroutine。
我检查了 c 和 go 源代码,没有发现线程或 goroutine 泄漏。 我使用“dlv”来调试应用程序,这是其中一个线程的堆栈:
(dlv) bt
0 0x000000000046df03 in runtime.futex
at /home/vagrant/resource/go/src/runtime/sys_linux_amd64.s:388
1 0x0000000000437e92 in runtime.futexsleep
at /home/vagrant/resource/go/src/runtime/os_linux.go:45
2 0x000000000041e042 in runtime.notesleep
at /home/vagrant/resource/go/src/runtime/lock_futex.go:145
3 0x000000000044036d in runtime.stopm
at /home/vagrant/resource/go/src/runtime/proc.go:1594
4 0x0000000000441178 in runtime.findrunnable
at /home/vagrant/resource/go/src/runtime/proc.go:2021
5 0x0000000000441cec in runtime.schedule
at /home/vagrant/resource/go/src/runtime/proc.go:2120
6 0x0000000000442063 in runtime.park_m
at /home/vagrant/resource/go/src/runtime/proc.go:2183
7 0x0000000000469f1b in runtime.mcall
at /home/vagrant/resource/go/src/runtime/asm_amd64.s:240
不知道这些线程是从哪里来的或者可能是golang运行时的线程池?
谁能看一下,非常感谢!
【问题讨论】:
-
请显示代码...您可以使用play.golang.org
-
对不起,这是公司的项目。我不能在这里发布代码。我看了上面提到的堆栈的源代码,似乎睡眠逻辑还可以,调度程序将“m”置于睡眠状态并等待下一次唤醒。但是每次调度器都会启动一个新的“m”来运行任务,所以之前的“m”不会被唤醒,会一点一点地消耗线程。
标签: multithreading go goroutine