go并发编程实践

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)
}
相关文章
相关标签/搜索