协程
协程是轻量级的线程,在Go语言中对应着goroutine,由Go Runtime管理。由于Go在运行的过程中,如果多个goroutine在同时运行,当且仅当运行这个goroutine的线程被阻塞的时候,调度器也才会运行另外的goroutine。
这就意味着
1 | go func() { |
这种函数被调用之后,这个goroutine会长期霸占着线程,而其它goroutine就只能饿死在内存中。
这种情况下,通过strace -f去跟踪系统调用的debug方式,是无法获取正确的信息。
kill大法
Go程序在默认的信号处理中,如果收到了SIGQUIT的信号时,会将正在运行时的goroutine的调用栈输出。即:
1 | kill -3 *** |
然后知道,自己是怎么坑自己的!