首页 > 代码库 > go语言中的并发
go语言中的并发
package main;import ( "fmt" "runtime" "sync")//goruntine奉行通过通信来共享内存,而不是共享内存来通信//channel是goruntine沟通的桥梁,大都是阻塞同步的//通过make创建,close关闭//channel是引用类型//使用for range来迭代操作channel//可设置单向或双向通道//可设置缓存大小,在未被填满前不会发生阻塞func main() { //这里需要设置chan的类型 ch := make(chan bool); go func() { fmt.Println("run..."); ch <- true; }(); //这里是阻塞的,等到匿名函数执行完成,给ch设置为true时 //这里能读取出数据时,就退出。 <-ch; ch1 := make(chan bool); go func() { fmt.Println("run..."); ch1 <- true; close(ch1); }(); //对chan进行迭代操作时,必须在某个地方关闭该chan,不然会发生死锁 for v := range ch1 { fmt.Println(v); } //有缓存是异步的 ch2 := make(chan bool, 1); go func() { fmt.Println("run..."); <-ch2; }(); ch2 <- true; //使用多核 runtime.GOMAXPROCS(runtime.NumCPU()); ch3 := make(chan bool, 10); for i := 0; i < 10; i++ { go run(ch3, i); } //这里读取10次,跟上面go run()执行次数相同 //保证10次运行都执行完,才退出 for i:= 0; i < 10; i++ { <-ch3; } //这里创建任务 wg := sync.WaitGroup{}; wg.Add(10); for i := 0; i < 10; i++ { go run2(&wg, i); } //等待所有任务完成 wg.Wait(); //有多个chan时,如何处理 ch4, ch5 := make(chan int), make(chan string); //用于判断是否关闭 ch6 := make(chan bool); go func() { for { select { case v, ok := <-ch4: if !ok { ch6 <- true; break; } fmt.Println(v); case v, ok := <-ch5: if !ok { ch6 <- true; break; } fmt.Println(v); } } }(); ch4 <- 1; ch4 <- 2; ch5 <- "hello"; ch5 <- "world"; close(ch4); close(ch5); //循环读取二次 for i := 0; i < 2; i++ { <-ch6; }}func run(ch chan bool, ix int) { a := 0; for i := 1; i < 10000; i++ { a += i; } fmt.Println(ix, a); //给chan传递true,说明该run执行结束 ch <- true;}func run2(wg *sync.WaitGroup, ix int) { a := 0; for i := 1; i < 10000; i++ { a += i; } fmt.Println(ix, a); //任务完成 wg.Done();}
go语言中的并发
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。