什么是coroutines
协程是计算机程序的一类组件,推广了非抢先多任务的子程序,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自Simula和Modula-2语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务、异常处理、事件循环、迭代器、无限列表和管道。
简单的说协程就是比线程更小的执行单位,但是线程是CPU调度执行的最小单位,所以多个协程组成一线程,他们共享线程的资源和CPU的时间片,在现代CPU中处理速度非常之快,多以在线程中切换也绰绰有余,很多现代编程语言都有coroutines这个概念,但是协程源于:Simula和Modula-2语言,支持协程的语言还有:Swift C# Kotlin Stackless Python Lua Io Go JavaScript(ECMA-262 6th Edition) Dart2
go语言中协程的使用
在go语言中,设计者将go的协程抽象的很好,开发者使用起来非常简单
Channel
我们知道线程之间需要通信,java中JMM用共享内存的方式通信,而在go语言中用Channel的方式通信
代码实现
package main
import (
"fmt"
"sync"
)
func chanDemo() {
var workers [10]worker
//等待机制
var wg sync.WaitGroup
wg.Add(20)
for i := 0; i < 10; i++ {
workers[i] = createWorker(i, &wg)
}
//将Channel中放入任务
for i := 0; i < 10; i++ {
workers[i].in <- 'a' + i
}
for i := 0; i < 10; i++ {
workers[i].in <- 'A' + i
}
//等待
wg.Wait()
//for _, worker := range workers {
// <-worker.done
//}
//for _, worker := range workers {
// <-worker.done
//}
}
//定义worker结构体
type worker struct {
in chan int
done func()
}
func doWorker(id int, w worker) {
for value := range w.in {
fmt.Printf("doWorker %d recived %c\n", id, value)
w.done()
}
}
func createWorker(id int, wg *sync.WaitGroup) worker {
w := worker{
in: make(chan int),
done: wg.Done,
}
go doWorker(id, w)
return w
}
func main() {
//函数式一等公民
chanDemo()
}