go语言中,并发执行程序,只须要一个go关键字便可。编程
写了一段测试代码以下:多线程
package main import ( "fmt" ) func main() { go func(){ fmt.Println("go") }() fmt.Println("done") }
程序输出为 done并发
奇怪的是,go没有输出。函数
讲道理,输出应该是go done,这样才对。测试
看了下例子,从新改写了一下代码:线程
package main import ( "fmt" "time" ) func main() { go func(){ fmt.Println("go") }() fmt.Println("done") time.Sleep(time.Second) }
此次输出为:done gocode
为什么暂停一下,就能输出go。进程
个人理解是,go的并发编程,实际上是多线程的,不是多进程的。多进程
mian函数是一个进程,而go启用的,是mian下面的一个线程,当没有暂停时,主进程结束了,go后面的函数还没来得及执行,就被回收了。而暂停了一下,因为计算机的执行速度很是快,哪怕只有1秒钟,都够线程执行了,所以可以顺利的打印出“go”来。class
假设go后面执行的函数,是一个超级漫长的逻辑,很是耗时的处理流程,那么暂停一下确定也是不行的。
测试代码:
package main import ( "fmt" "time" ) func main() { go func(){ i:=0 for{ fmt.Println(i) i++ } }() fmt.Println("done") time.Sleep(time.Second) }
讲道理,这个死循环应该要一直执行下去,可是1秒钟后,仍是中止执行了,说明猜测是正确的。
这样的话,若是是并发的编程,在mian最后,都须要个死循环来让主线程一直存在,好比
for{ time.Sleep(time.Second) }