常见并发模型
- 进程 & 线程(Apache)C10K
- 异步非阻塞(Nginx,Libevent,NodeJS) 复杂度高
- 协程 (Golang,Erlang,Lua)
并发与并行
- 并发:指同一时刻,系统通过调度,来回切换交替的运行多个任务,"看起来"是同时进行
-
并行:指同一时刻,两个任务"真正的"同时进行
图一.png
Golang并发实现
- 程序并发执行(goroutine)
- 多个goroutine间的数据同步和通信(channels)
- 多个channel选择数据读取或写入(select)
Goroutine(程序并发执行)
foo() //执行函数foo,程序等待函数foo返回
go foo() //执行函数foo
bar() //不用等待foo返回
Channels(多个goroutine间的数据同步和通信)
c := make(chan string) //创建一个channel
go func() {
time.Sleep(time.Second*1)
c <- "hello world" //发送数据到channel中
}()
msg := <- c //阻塞直到接收到数据
Select(从多个channel中读取或写入数据)
select{
case v := <-c1:
fmt.Println("channel 1 send",v)
case v := <-c2:
fmt.Println("channel 2 send",v)
default: //可选
fmt.Println("channel was ready")
}
//c1和c2同时有数据时,select随机选一个
网友评论