博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言中的并发
阅读量:5943 次
发布时间:2019-06-19

本文共 1697 字,大约阅读时间需要 5 分钟。

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();}

  

转载于:https://www.cnblogs.com/jkko123/p/6820352.html

你可能感兴趣的文章
shell中while循环里使用ssh的注意事项
查看>>
SHELL获取计算机外网ip的几种写法
查看>>
博客正在搬迁中
查看>>
触发器与存储过程的区别
查看>>
我的友情链接
查看>>
centos搭建supervisor
查看>>
linux日志分割
查看>>
我的友情链接
查看>>
Spring学习资料之 依赖注入(一)
查看>>
安装win7提示安装程序无法创建新的系统分区和定位现有系统分区
查看>>
快递查询接口的调用与解析案例
查看>>
服务器性能优化配置建议
查看>>
oracle sql语句实现累加、累减、累乘、累除
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
第十三章:SpringCloud Config Client的配置
查看>>
使用 GPUImage 实现一个简单相机
查看>>
CoinWhiteBook:区块链在慈善事业中的应用
查看>>