非阻塞的方式
linux和Nginx都是采用select+epoll的方式,就是,主机一直在忙活着,谁准备好了可以处理了,我就先处理谁。大家都没准备好的话,我就做自己的事。
- 主机只做自己的事
- 主机分时间片,每个小任务分配5秒钟,但你分配给它这个子任务的时候,它不一定准备好了。
- 每个任务注册事件,谁准备好了,就去处理谁。
SELECT
通过select来判断chan,并执行对应的操作。
package main
import(
"fmt"
"time"
)
func main(){
ch := make (chan int)
go func(ch chan int){
ch <- 1
}(ch)
time.Sleep(time.Second)
select{
case <-ch:
fmt.Println("read ok from chan")
default:
fmt.Println("default end")
}
}
SELECT + 用chan作为timeout标志
package main
import(
"fmt"
"time"
)
func main(){
ch := make (chan int)
timeout := make (chan int, 1)
go func(tot chan int){
ch <- 1
time.Sleep(time.Second)
tot <- 1
}(timeout)
//time.Sleep(time.Second)
select{
case <-ch:
fmt.Println("read ok from chan")
case <- timeout:
fmt.Println("timeout")
default:
fmt.Println("default end")
}
}