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语言中的并发的更多相关文章

  1. Go语言中的并发编程

    并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ...

  2. UML语言中五大视图和九种图形纵览

    UML语言纵览 视图 UML语言中的视图大致分为如下5种: 1.用例视图.用例视图强调从系统的外部参与者(主要是用户)的角度看到的或需要的系统功能. 2.逻辑视图.逻辑视图从系统的静态结构和动态行为角 ...

  3. Go语言基础之并发

    并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ...

  4. GO学习-(18) Go语言基础之并发

    Go语言基础之并发 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微 ...

  5. Golang语言系列-11-goroutine并发

    goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...

  6. Go语言系列之并发编程

    Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(宏观上并行,微观上并发). 并行:同一时刻执行多个任务(宏观和微观都是并行). Go语言的并发通过goroutine实现.gorout ...

  7. 【Golang详解】go语言中并发安全和锁

    go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 [锁]详解区分 互斥锁.⾃旋锁.读写锁.乐观锁.悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号 ...

  8. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  9. Rust语言:安全地并发

    http://www.csdn.net/article/2014-02-26/2818556-Rust http://www.zhihu.com/question/20032903 Rust是近两年M ...

随机推荐

  1. mycat的schema.xml的个人的一点理解

    官方文档里讲的详细的部分的我就不再赘述了,我只是谈谈我自己的理解 刚开始接触mycat,最重要的几个配置文件有server.xml,schema.xml,还有个rule.xml配置文件 具体都是干啥用 ...

  2. Centos7升级新内核

    由于觉得Centos7内核版本还不够高,就想升级下,下面是升级步骤 我使用的方法是使用yum升级内核 使用第三方仓库升级 CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新 ...

  3. Redis进阶实践之二如何在Linux系统上安装安装Redis(转载)(2)

    Redis进阶实践之二如何在Linux系统上安装安装Redis 一.引言 上一篇文章写了“如何安装VMware Pro虚拟机”和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我 ...

  4. python模块sys

    #!/bin/env python #-*- encoding=utf8 -*- import sys if __name__=="__main__": # 在解释器启动后, ar ...

  5. 尚未解决的webpack问题

    91% additional asset processing 打包过程中,在91%的时候会出现卡顿几秒 在js,css使用chunkhash替代hash 字体和图片:没有此chunkhash,只有h ...

  6. KVM虚拟化技术(二)KVM介绍

    KVM:Kernel Virtual Machine KVM是基于虚拟化扩展的x86硬件,是Linux完全原生的全虚拟化解决方案.部分半虚拟化支持,主要是通过半虚拟网络驱动程序的形式用于Linux和W ...

  7. jsp 静态引入<%@ include %> 动态引入<jsp:include> 区别

    1. 首先先介绍下,jsp机制:  servlet容器,先将jsp转化成servlet,然后编译成.class文件,放置容器缓冲区[tomcat的work目录下]. 每次调用jsp时,服务器会读取编译 ...

  8. 【原】linux学习路径

    1.  <<The Linux Command Line A Complete Introduction>> 2.  <<Advanced Programming ...

  9. mongo副本集设置主库权重,永远为主

    mongo副本集设置主库权重,即使主库宕机了再重启也还是主库. cfg = rs.conf()     ------->(查看序列)cfg.members[0].priority = 1 (设置 ...

  10. 05_ssm基础(六)之SpringMVC

    36.springMVC之入门 1.springMVC简介 Spring MVC是基于MVC模式的一个Web框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化.等等),而且使用简 ...