当前位置: 首页 > news >正文

go 协程

golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了

  1. 如何实现go协程
    只需要在函数前面加上go即可
go task()
package mainimport ("fmt""time"
)func show(msg string) {for i := 0; i < 5; i++ {fmt.Printf("msg: %v\n", msg)time.Sleep(time.Microsecond * 1000)}
}func main() {go show("go show") //开辟goroutines中运行show("haha")       //这个会在main函数的goroutines中运行//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. channel
    它是一个数据管道,可以往里面写数据,从里面读数据。
    channel 是 goroutine 之间数据通信桥梁,而且是线程安全的。
    channel 遵循先进先出原则。
    写入,读出数据都会加锁。
    channel 可以分为 3 种类型:
  • 只读 channel,单向 channel
  • 只写 channel,单向 channel
  • 可读可写 channel

channel 还可按是否带有缓冲区分为:

  • 带缓冲区的 channel,定义了缓冲区大小,可以存储多个数据
  • 不带缓冲区的 channel,只能存一个数据,并且只有当该数据被取出才能存下一个数据
unbuffered:=make(channel int)
buffered:=make(channel int,10)
package mainimport ("fmt""math/rand""time"
)var channeltest = make(chan int)func show(msg string) {value := rand.Intn(10)channeltest <- value // 往管道中写数据}func main() {defer close(channeltest) // 关闭管道go show("go show")       //开辟goroutines中运行time.Sleep(time.Second * 1)value := <-channeltest //从channel中获取数据fmt.Printf("value: %v\n", value)//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. waitgroup实现同步
    类似于.net中的task wait,你可以取消下面wg 的试试看两者的区别,我们添加完wg后发现,a以及b函数都执行完毕
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc a() {defer wg.Done()for i := 0; i < 10; i++ {fmt.Println("a函数")time.Sleep(time.Microsecond * 100)}
}func b() {defer wg.Done() //别忘了在一次执行完毕后运行这个函数for i := 0; i < 10; i++ {fmt.Println("b函数")time.Sleep(time.Microsecond * 100)}
}func main() {wg.Add(1) //在每一个go之前执行这个行数go a() //开辟goroutines中运行wg.Add(1)go b()wg.Wait()//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. Mutex
    锁,用来解决同时访问全局变量
package mainimport ("fmt""runtime""sync""time"
)var wg sync.WaitGroup
var value int = 100
var lock sync.Mutexfunc a() {defer wg.Done()for i := 0; i < 100; i++ {lock.Lock()value += 1lock.Unlock()fmt.Println("a++")time.Sleep(time.Microsecond * 100)}
}func b() {defer wg.Done()for i := 0; i < 100; i++ {lock.Lock()value -= 1lock.Unlock()fmt.Println("a--")time.Sleep(time.Microsecond * 100)}
}func main() {fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())runtime.GOMAXPROCS(8) //最大并发wg.Add(1)go a()wg.Add(1) //开辟goroutines中运行go b()wg.Wait()fmt.Println("end..........")fmt.Printf("value: %v\n", value)
}
  1. runtime包
  • runtime.Gosched() 让出CPU,重新等待安排任务
package mainimport ("fmt""runtime"
)func a() {for i := 0; i < 2; i++ {fmt.Println("a函数")}}func main() {fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())runtime.GOMAXPROCS(8) //最大并发go a()                //开辟goroutines中运行for i := 0; i < 2; i++ {runtime.Gosched() //让出CPU,执行A函数fmt.Printf("i: %v\n", i)}fmt.Println("end..........")
}
  • runtime.Goexit() 退出协程
  • runtime.GOMAXPROCS(8) 最大并发
  1. select Switch
  • select是Go中的一个控制结构,类似于Switch语句,用于处理异步IO操作。select会监听语句中channel的读写操作,当case中channel读写操作为非阻塞状态时,将会触发相应的动作
  • select中的case语句必须是一个channel操作
  • select中的default自居总是可运行的
  • 如果有多个case都可以运行,select会随机公平的选出一个执行,其他不会执行
  • 如果没有可执行的case语句,且有default语句,那么会执行default
  • 如果没有可运行的case语句,且没有default语句,select将阻塞,知道某个case可以运行
package mainimport ("fmt""time"
)var valueint = make(chan int)
var valurstring = make(chan string)func main() {//关闭通道后会读取类型默认值,如int默认值为0go func() {valueint <- 100valurstring <- "haha"defer close(valueint)defer close(valurstring)}()for {select {case r := <-valueint:fmt.Printf("valueint: %v\n", r)case r := <-valurstring:fmt.Printf("valurstring: %v\n", r)default:fmt.Println("default .....")}time.Sleep(time.Second)}
}
  1. ticker
    ticker会一直运行,timer只运行一次
package mainimport ("fmt""runtime""time"
)var valueint = make(chan int)func main() {ticker := time.NewTicker(time.Second)//关闭通道后会读取类型默认值,如int默认值为0go func() {//每秒钟随机的往通道插入数据for _ = range ticker.C {select {case valueint <- 1:case valueint <- 2:case valueint <- 3:}}}()var sum intfor v := range valueint {fmt.Printf("v: %v\n", v)sum += vif sum >= 10 {runtime.Goexit()}}
}

相关文章:

go 协程

golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了 如何实现go协程 只需要在函数前面加上go即可 go task()package mainimport ("fmt""time" )func show(msg string) {for i : 0; i < 5; i {fmt.Printf("msg: …...

【python爬虫案例】用python爬豆瓣读书TOP250排行榜!

文章目录 一、爬虫对象-豆瓣读书TOP250二、python爬虫代码讲解三、讲解视频四、完整源码 一、爬虫对象-豆瓣读书TOP250 您好&#xff0c;我是 马哥python说 &#xff0c;一名10年程序猿。 今天我们分享一期python爬虫案例讲解。爬取对象是&#xff0c;豆瓣读书TOP250排行榜数…...

Qt中 gui 模块和 widgets 模块的区别

1. gui 模块提供了基本的图形系统抽象层,包括QPaintDevice、QPainter等类,这些类构成了Qt的绘图基础。 2. widgets 模块在 gui 模块的基础上,提供了完整的桌面级用户界面控件,如按钮、列表、滑块等。这些控件继承自更基础的图形类。 3. gui 模块是更底层的图形功能,widgets模…...

feign调用流程

...

15-数据结构-二叉树的遍历,递归和非递归

简介&#xff1a; 本文主要是代码实现&#xff0c;二叉树遍历&#xff0c;递归和非递归&#xff08;用栈&#xff09;。主要为了好理解&#xff0c;直接在代码处&#xff0c;加了详细注释&#xff0c;方便复习和后期默写。主要了解其基本思想&#xff0c;为后期熟练应用…...

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…...

overlayfs

参考&#xff1a;How containers work: overlayfs how overlays work Overlay filesystems, also known as “union filesystems” or “union mounts” let you mount a filesystem using 2 directories: a “lower” directory, and an “upper” directory. Basically: t…...

Mysql中九种索引失效场景分析

表数据&#xff1a; 索引情况&#xff1a; 其中a是主键&#xff0c;对应主键索引&#xff0c;bcd三个字段组成联合索引&#xff0c;e字段为一个索引 情况一&#xff1a;不符合最左匹配原则 去掉b1的条件后就不符合最左匹配原则了&#xff0c;导致索引失效 情况二&#xff…...

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说&#xff0c;接下来的几篇文章主要说一下 RecyclerView 的实用小功能&#xff0c;包括 列表宫格的切换&#xff0c;吸顶效果&#xff0c;多布局效果等&#xff0c;今天这篇文章就来实现一下列表宫格的切换&#xff0c;效果如下 一、数据来…...

妈妈的爱依然深沉

村里的孩子为了买化肥&#xff0c;跟城里官老爷们借了好多钱。 那几年庄稼转手很快&#xff0c;不是用来吃的&#xff0c;因此借钱成本很高&#xff0c;大概LPR加100bp。 后来村里孩子终于发现庄稼终究只能用来吃&#xff0c;不再热衷买卖化肥。可是官老爷们的金融生意还要继续…...

net.ResolveTCPAddr(“tcp6“, address)

尝试解析 "www.google.com" 的IPv6地址。如果解析成功&#xff0c;程序将打印出解析后的IP地址、端口以及区域信息。如果解析失败&#xff0c;程序将打印出错误信息。 需要注意的是&#xff0c;如果 "www.google.com" 没有IPv6地址&#xff0c;或者本地网络…...

mysql和mybatisPlus实现:datetime类型的字段范围查询

前提说明 数据库在存储数据时,我们为了精确一下时间,便会把改时间类型的字段设置为datetime类型; 在过滤数据库数据时,我们又需要对该字段进行一个范围的过滤 由此,便出现了这篇博客 datetime数据类型 在MySQL中,datetime数据类型用于保存日期和时间的值。它的格式为Y…...

学习笔记:用ROS接收rosbag发布的topic

用ROS接收 bag.open发布的topic python语言 要使用ROS接收保存在rosbag文件中的话题消息&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.首先&#xff0c;请确保你已经安装了ROS和相关的依赖。 2.创建一个ROS功能包&#xff08;或使用现有的功能包&#xff09;来处理…...

LAMP架构介绍配置命令讲解

LAMP架构介绍配置命令讲解 一、LAMP架构介绍1.1概述1.2LAMP各组件的主要作用1.3各组件的安装顺序 二、编译安装Apache httpd服务---命令讲解1、关闭防火墙&#xff0c;将安装Apache所需的软件包传到/opt/目录下2、安装环境依赖包3、配置软件模块4、编译安装5、优化配置文件路径…...

C语言之函数题

目录 1.乘法口诀表 2.交换两个整数 3.函数判断闰年 4.函数判断素数 5.计算斐波那契数 6.递归实现n的k次方 7.计算一个数的每位之和&#xff08;递归&#xff09; 8.字符串逆序&#xff08;递归实现&#xff09; 9.strlen的模拟&#xff08;递归实现&#xff09; 10.求…...

SpringBoot的四种handler类型

Controller ReuestMapping 实现Controller接口 使用Component将该类封装成一个Bean 实现HttpRequestHandler 实现RouterFunction...

基于KNN算法的鸢尾花种类预测

导入数据 iris_data load_iris() iris_data.data[0:5, :]array([[5.1, 3.5, 1.4, 0.2],[4.9, 3. , 1.4, 0.2],[4.7, 3.2, 1.3, 0.2],[4.6, 3.1, 1.5, 0.2],[5. , 3.6, 1.4, 0.2]])# 特征值名称 iris_data.feature_names[sepal length (cm),sepal width (cm),petal length (cm…...

英语-面试

自我介绍 hi,my name is tzh,26 years old.I major in software engineering. I participate in the design and development of the social project and e-commerce project. I master java and algorithm. Im familiar with gateway,spring,springboot,springcloud,redis…...

文件传输协议

文章目录 一、FTP1. 定义2. 端口3. 数据传输方式主动方式被动方式 二、TFTP三、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、FTP 1. 定义 文件传输协议&#xff08;FTP&#xff09;是一种用于在客户端和服务器之间进行文件传输的标准网络协…...

Llama-2大模型本地部署研究与应用测试

最近在研究自然语言处理过程中&#xff0c;正好接触到大模型&#xff0c;特别是在年初chatgpt引来的一大波AIGC热潮以来&#xff0c;一直都想着如何利用大模型帮助企业的各项业务工作&#xff0c;比如智能检索、方案设计、智能推荐、智能客服、代码设计等等&#xff0c;总得感觉…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…...