Goroutine
Goroutine
协程的设计隐藏了线程创建和管理的诸多复杂性,在多线程操作系统上可实现多路复用,因此若一个线程阻塞,比如说等待
定义与使用
简单来说,
func main() {
go sayHello()
// continue doing other things
}
func sayHello() {
fmt.Println("hello, world")
}
执行 go sayHello()
语句创建
对于匿名函数,同样也能这么干,从下面这个例子你可以看得很明白。在下面的例子中,我们不是从一个函数建立一个
go func() {
fmt.Println("hello")
}()// 1
// continue doing other things
注意这里的
sayHello := func() {
fmt.Println("hello")
}
go sayHello()
// continue doing other things
Go Concurrency Patterns
我们可以通过
- 这个任务什么时候开始,什么时候结束?
- 怎么做到当所有子任务都结束,主任务再结束?
- 假如某个子任务失败,主任务如何终止掉其他子任务?
- 如何保证所有子任务在某个特定的超时时间内返回,无论它成功还是失败?
- 更进一步,如何保证主任务在规定的时间内返回,无论其成功还是失败,同时终止掉它产生的所有子任务?
- 主任务已经结束了,子任务还在运行,是不是存在资源泄漏?
当然这些问题在