首页
IT
登录
6mi
u
盘
搜
搜 索
IT
Go语言学习笔记22
Go语言学习笔记22
xiaoxiao
2025-04-03
12
chap04 并发编程 1.Go语言支持语言级别轻量级别线程,称之为goroutine,由Go语言运行时runtime管理。如下多线程实例: package main import ( "fmt"; "sync"; "runtime" ) var counter int = 0 func Count(lock *sync.Mutex){ lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main(){ lock:=&sync.Mutex{} for i:=0;i<10;i++ { go Count(lock) } for { lock.Lock() c:=counter lock.Unlock() runtime.Gosched() //用于让cpu让出时间片 if c>=10 { break } } } 2.Go语言共享数据理念:不要通过共享内存来通信,而应该通过通信来共享内存。 3.channel是go语言goroutine间的通信方式。可以使用channel在不同的goroutine线程之间传递消息。channel是类型相关的。 定义:var chanName chan type ,初始化:chanName := make(chan type)。 写入:chanName <- value,读取:value := <- chanName。读取都会导致程序阻塞等待。 package main import "fmt" import "time" func Count(ch chan int){ ch <- 1 fmt.Println(time.Now().UnixNano()) } func main(){ chs := make([]chan int,10) for i:=0;i<10;i++{ chs[i] = make (chan int) go Count(chs[i]) } for _,ch := range(chs) { <-ch fmt.Println("--------") } } 输出: 1470927062503429479 -------- 4.select用于处理异步io,类似于switch,但是case的条件必须是io操作,没有判断条件。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 package main import "fmt" func main(){ ch := make(chan int,1) for { select { case ch <- 0: case ch <- 1: } i:=<-ch fmt.Println("Value received",i) } } 需要确保执行时有一个case可以执行,否则死锁:fatal error: all goroutines are asleep - deadlock! package main import "fmt" func main(){ ch := make(chan int,1) for { select { case <-ch : } fmt.Println("Value received") } } 5.缓冲机制:设置缓冲区,缓冲区写满后才阻塞写。ch:=make(chan int,1024) 6.利用channel处理超时: package main import "fmt" import "time" func main(){ timeout := make(chan bool,1) go func(){ time.Sleep(time.Second) timeout<-true }() var ch chan int select { case <- ch : case <- timeout: fmt.Println("TimeOut...") } } 7.单项channel: 正常:var ch chan int 单项写:var ch chan<- int 单项读:var ch <-chan int 8.runtime.GOMAXPROCS(N)设置N个cpu参与到运算。runtime.Sched()释放时间片。 9.同步锁:syncMutex。读写锁:sync.RWMutex。 10.全局唯一操作:sync.Once package main import "fmt" import "sync" var once sync.Once func hi() { fmt.Print("hi") } func main(){ for i:=0;i<10;i++ { fmt.Println("Round",i) once.Do(hi) } }
转载请注明原文地址: https://ju.6miu.com/read-1297700.html
最新回复
(
0
)