golang并发练习代码笔记
golang语言的精髓就是它的并发机制,十分简单,并且极少数在语言层面实现并发机制的语言,golang被成为网络时代的c语言,golang的缔造者也有c语言的缔造者,Go语言是google
推出的一门静态语言,自带方便的命令行工具,简洁的语法,虽然简洁但是足够强大,是编写高并发服务器理想的语言。
在goang中开启一个新的协程十分简单,使用go就可以开一个协程,每需要一个协程就用go开一个。
当然其中有些细节需要注意。
由于go协程是并发的因此,在使用的时候要注意主协程结束的时候,是不会等待其他未完成的协程,所以,有关资源竞争就引出channel来解决资源竞争的问题,
屏幕的输出也是一种资源竞争因此在下面的练习代码中使用了打印字符的方式体现并发机制,和资源竞争。
go语言推行使通信来实现资源竞争产生的混乱和丢失问题。
package main
import “fmt” func main() {
go func(){
fmt.Println("协程一")
}()
go func(){
fmt.Println("协程二")
}()
fmt.Println("结束")
}
这个例子只能输出“结束”
因为主协程已经结束运行了,并发协程来不及打印,主协程不会等待其他goroutine结束,
加入channel之后,就可以实现协程之间的通信机制,感受到golang的设计哲学。
同样是上面的例子,我们通过加入chan类型的通信消息变量解决上面程序的问题
var chani chan int
var chanj chan int
func main() {
go func() {
fmt.Println("协程一")
chani <-
chanj <-
}() go func() { fmt.Println("协程二")
<-chani
close(chani)
}()
runtime.Gosched() //这个函数可以出让执行时间片,让别的协程执行
fmt.Println("结束")
}
channel是可以定义单向的消息
ch :=make(chan int) //创建一个双向的消息channel var channel1 <-chan int =ch //只读
var channel2 chan<- int =ch //只写
定时器,也是通过channel来实现延时的过程
func main() {
//计时器的使用
for i := ; i < ; i++ {
timer := time.NewTimer( * time.Second)
fmt.Println("现在时间:", time.Now())
t := <-timer.C
fmt.Println(t, "\n", timer)
}
}
计时器是可以重置,和停止
timer.Stop()
timer.Reset()
在golang语言中有了channel,也引出了select
通过select语句可以监听channel上的数据流活动
select语句很像switch语句,由select语句
select{
case <-chan1:
//如果chan1读到数据,则该case处理数据
case <-:
//如果成功写入数据,则该case处理
default:
//默认
select语句有很多的限制条件的
每个case语句必须是一个IO操作
如果任意一个可执行,选任意一个
如果没有default语句,没有满足case的时候,就会阻塞直到有case语句满足
用select实现斐波那契数列。(程序来源黑马程序员网络教程)
func fibonacci(ch chan<- int ,quit <-chan bool){
x,y :=,
for {
//监听channel数据流动
select{
case ch<-x:
x,y=y,x+y
case flag:=<-quit:
fmt.Println("flag=:",flag)
return
}
}
}
func main(){
ch :=make(chan int)
quit :=make(chan bool)
go func(){
for i:=;i<;i++{
num:=<-ch
fmt.Println(num)
}
quit<-true
}()
fibonacci(ch,quit)
}
golang并发练习代码笔记的更多相关文章
- Golang语法与代码格式速记【转】
// Description: Golang语法与代码格式速记 // Author: cxy // Date: 2013-04-01 // Version: 0.3 // TODO 说明 // TOD ...
- golang并发编程
golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...
- Golang 并发简介
并发概要 随着多核CPU的普及, 为了更快的处理任务, 出现了各种并发编程的模型, 主要有以下几种: 模型名称 优点 缺点 多进程 简单, 隔离性好, 进程间几乎无影响 开销最大 多线程 目前使用最多 ...
- golang 并发顺序输出数字
参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...
- Java并发编程学习笔记
Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...
- 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...
- 并发编程学习笔记(11)----FutureTask的使用及实现
1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...
- 并发编程学习笔记(12)----Fork/Join框架
1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
随机推荐
- Fragment的陷阱:概述
现在主流的APP都会使用到Fragment,相信你也一定使用过,今天为大家介绍一下我曾经踏过的一个关于Fragment的坑. 以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragmen ...
- CentOS yum 安装RabbitMQ
最近在做机器学习的任务系统,任务模块使用了消息对联,比较快速的搭建方法: 1.安装erlang 下载rpm仓库:wget http://packages.erlang-solutions.com/er ...
- Visual C++中error spawning cl.exe解决方法
点击“Tools”,选择“选项”,选择“选项”中的“目录” 目录的目录下有四个选项 需要对它们设置正确的路径 我是按照默认路径安装的 可执行文件: C:\Program Files\Microsoft ...
- springboot成神之——发送邮件
本文介绍如何用spring发送邮件 目录结构 依赖 MailConfig TestController 测试 本文介绍如何用spring发送邮件 目录结构 依赖 <dependency> ...
- 【279】◀▶ Python 运算符说明
参考:Python 运算符说明 目录: 一.算术运算符 二.比较(关系)运算符 三.赋值运算符 四.位运算符 五.逻辑运算符 六.成员运算符 七.身份运算符 八.运算符优先级 一.Python 算术运 ...
- java Web jsp嵌入代码的三种方式
1,表达式标签 <%= 2+3%> 唯一有显示功能的标签 作用: 计算表达式的返回值 将表达式的返回值显示到网页中. 注意: 表达式中不能有分号 2,普通脚本标签 <% %> ...
- Codeforces 1120D (树形DP 或 最小生成树)
题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...
- WebFlux04 SpringBootWebFlux集成MongoDB之Windows版本、WebFlux实现CRUD、WebFlux实现JPA、参数校验
1 下载并安装MongoDB 1.1 MongoDB官网 1.2 下载 solutions -> download center 1.3 安装 双击进入安装即可 1.3.1 安装时常见bug01 ...
- SpringBoot15 sell02 订单模块
1 订单模块 1.1 MySQL数据表 订单模块涉及到两个数据表: 订单表:主要存储订单相关的基本信息 DROP TABLE IF EXISTS `order_master`; CREATE TABL ...
- App测试从入门到精通之兼容性和回归测试
兼容性测试需要考虑的APP测试点 1.不同网络环境下的兼容性测试 2.不同手机操作系统兼容性测试 3.不同应用软件的兼容性测试 4.不同的容量大小的SIM卡之间的互相兼容测试 5.当安装杀毒软件时,应 ...