Go语言的并发

golang学习笔记11——Go 语言的并发与同步实现详解 Go 语言的并发与同步机制使得开发者能够轻松地编写高效的并发程序。通过 goroutine 和 channel,开发者可以实现轻量级的并发编程,提高程序的性能和响应速度。同时,通过 mutex 和 wait group 等同步机制,开发者可以保护共享资源,确保程序的正确性。在实际开发中,开发者可以根据具体的需求选择合适的并发和同步机制,以实现高效、可靠的程序。**关注我看更多有意思的文章哦!**👉👉。 阅读详情

Go语言的并发

1 基本概念

(1)并行和并发

并发(Concurrency):把多个任务在不同的时间点分配给处理器处理,在同一时间点,任务并不会同时运行。

并行(Parallelism):把每一个任务分配给每一个处理器独立处理,在同一时间点,任务一定是同时运行。

(2)进程、线程和协程

  1. 进程是正在执行中的程序实例,是系统进行资源分配和调度的一个独立单位,一个进程有多个线程。
  2. 线程是进程的一个实体,它是比进程更小的能独立运行的基本单位,一个线程有多个协程。
  3. 协程是一种用户态的轻量级线程,它的调度完全由程序控制。
  4. 线程是最小的执行单元,进程是最小的资源管理单元。

(3) Go语言并发

  1. Go语言中的协程叫Goroutine;
  2. Go语言中的通道叫channel,协程间的通信机制;
  3. Go语言中没有线程;

2 使用Go协程

2.1 创建协程

create_goroutine.go

package main

import (
	"fmt"
	"time"
)

// 实现工作和唱歌两个协程

// 唱歌
func sing() {
	for i := 0; i < 5; i++ {
		fmt.Println("Sing ", i)
		time.Sleep(time.Second * 1)
	}

	fmt.Println("Sing")
}

// 工作
func working() {
	i := 0
	for i < 5 {
		fmt.Println("Working ", i)
		i++
		// 睡眠1秒表示执行任务
		time.Sleep(time.Second * 1)
	}
}

func main() {
	fmt.Println("Execute goroutine")

	/*
		// Go创建协程的方法
		// 方法1,函数创建
		go 方法名(实际输入参数列表)

		// 方法2,匿名函数创建
		go func(输入参数列表){

		}(实际输入参数列表)
	*/
	go sing()
	go working()

	fmt.Println("End goroutine")
	// 睡眠等待协程执行
	time.Sleep(time.Second * 8)
}

执行

# go run create_goroutine.go
End goroutine
Sing  0
Working  0
Working  1
Sing  1
Working  2
Sing  2
Working  3
Sing  3
Working  4
Sing  4
Sing

2.2 创建通道

create_channel.go

package main

import (
	"fmt"
	"strconv"
	"sync"
	"time"
)

// 同步等待组
// 用于解决 “ fatal error: all goroutines are asleep - deadlock! ”
var wg sync.WaitGroup

// 唱歌
func sing(info chan string) {
	for i := 0; i < 5; i++ {
		// 睡眠,表示执行任务
		time.Sleep(time.Second * 1)

		tempMsg := "Mason sing " + strconv.Itoa(i)
		fmt.Println("Send: " + tempMsg)
		// 将数据传递给info通道
		info <- tempMsg
	}

	// 同步等待组,计数器减1
	defer wg.Done()
}

func main() {
	fmt.Println("Execute goroutine")

	/*
		// 创建channel
		// 方法1
		// 声明channel变量
		var 变量名称 chan 数据类型
		// 创建channel
		变量名称 = make(chan 数据类型)

		// 方法2
		// 声明channel变量,并创建channel
		变量名称 := make(chan 数据类型)
	*/

	var channelInfo chan string
	channelInfo = make(chan string)

	go func() {
		// 等待同步等待组的所有协程释放
		wg.Wait()
		// defer会延迟执行其后面跟随的语句
		defer close(channelInfo)
	}()

	// 同步等待组,计数器加1
	wg.Add(1)
	go sing(channelInfo)

	// 接收数据
	for value := range channelInfo {
		fmt.Println("Receive: ", value)
	}

	/*
		// 接收和阻塞数据都用“<-”符号
		// 阻塞接收数据的完整写法;
		// 接收数据变量是接收管道变量传输的变量数据,未接收到数据时是channel类型的零值;
		// 接收数据状态表示是否接收到数据(布尔类型),可以判断channel是否关闭;
		接收数据变量,接收数据状态 := <- 管道变量

		// 实例
		data, ok := <- myChannel

		// 忽略接收值
		<- 管道变量

		// 实例
		<- myChannel
	*/

	// 阻塞和接收数据
	<-channelInfo
}

执行

# go run create_channel.go
Execute goroutine
Send: Mason sing 0
Receive:  Mason sing 0
Send: Mason sing 1
Receive:  Mason sing 1
Send: Mason sing 2
Receive:  Mason sing 2
Send: Mason sing 3
Receive:  Mason sing 3
Send: Mason sing 4
Receive:  Mason sing 4
【Golang】Go语言中如何通过Goroutine快速实现高并发 并发编程是指在一个程序中同时运行多个任务,这些任务可以独立地执行,也可以相互协作。并发编程可以提高程序的执行效率,特别是在处理大量I/O操作或计算密集型任务时。 在Go语言中,并发编程主要通过goroutine和channel来实现。 Goroutine是Go语言独有的并发执行单元,它允许函数或方法并发执行,而无需手动管理线程。 Channel是Go语言中进行goroutine间通信和同步的主要机制。 阅读详情

相关推荐

Go 语言并发模型解析

作者:禅与计算机程序设计艺术 1.简介 1.什么是 Go 语言 Go 语言(官网):https://golang.org/ Go 是 Google 开发的一个开源编程语言,它的设计哲学在

AI天才研究院 2231

Go语言并发详解

文章目录一、Go语言并发简述(并发的优势)进程/线程并发/并行协程/线程Goroutine 介绍channel二、Go语言goroutine(轻量级线程)使用普通函数创建 goroutine1) 格式2) 例子使用匿名函数创建goroutine1) 使用匿名函数创建goroutine的格式2) 使用匿名函数创建goroutine的例子提示三、Go语言并发通信四、Go语言竞争状态简述Goroutine 7 (finished) created at: main.main() D:/code/src/m

qq_41854911的博客 1万+

达梦数据库与sharding-jdbc的深度适配实践

本文详细介绍了达梦数据库与sharding-jdbc的深度适配实践,包括驱动与依赖管理、核心适配实现、注册与配置等关键步骤。通过扩展shardingSphere的方式,成功实现了达梦数据库的分库分表功能,并提供了常见问题解决方案和性能优化建议,助力企业级应用高效处理海量数据。

weixin_30300225的博客 623

Go并发编程

并发介绍 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 C.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。 协程和线程 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。线程:一个线程上可以跑多个协程,协程是轻量级的线程...

上山的人 2111

国内外主流嵌入式GUI汇总

随着MCU资源增多,处理能力也强了,同时市场需求也增多了GUI功能也越来越丰富了,很多的嵌入式图形库都可以做出绚丽的界面。

m0_69914734的博客 3290

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

Go语言并发

此时main函数的Goroutine继续执行,如果helloworld()函数不能够在main函数的Goroutine执行完毕之前将任务处理完毕,那么就会发生helloworld()函数没有执行的样子;注意:使用go关键字创建协程时,被调用的函数往往没有返回值,如果函数有返回值,那么返回值会被忽略,那我们就是要返回值时,必须使用channel,通过channel把数据从中取出来;创建和启动主Goroutine,初始化操作,执行main函数,当main函数执行结束后,程序也就结束了;

Gavin 1243

Qt中输出中文出现乱码(win10系统下)

当我刚开始在win10下使用Qt Creator(4.3.0版本)时,遇到过这么个问题:当程序输出中文时,中文会乱码,程序本身的中文未乱码。 乱码截图如下: 我查阅了很多资料,最后在自己的不断的尝试下,解决了乱码问题。进入主题,具体如何解决乱码? ① 首先,我们先设置一下,可以直观在Qt界面上看到文件的编码方式: 点击工具(tool)->选项(option)->文本编辑器->显示->Diplayfileencoding,将其勾选上,点击apply,即可,截图如下...

请叫我皮皮虾的博客 5200

go 并发介绍

go 并发介绍

weixin_49260963的博客 425

Android14到Android16源码移植中的Bluetooth模块规范适配指南

本文详细解析了从Android14到Android16源码移植过程中Bluetooth模块的规范适配挑战,重点介绍了Android.bp配置差异及常见编译报错解决方案。针对代码规范检查、final字段声明、静态方法优化等核心问题提供实用修复方法,帮助开发者高效完成版本升级适配工作。

fire9的博客 254

element的el-cascader组件动态加载,以及报错处理问题

Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. 报错处理

weixin_56527169的博客 1264

Golang通道(chan,协程交互数据)

通道(channel)是用来传递数据的一个数据结构。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符

墨痕诉清风的博客 4074

大模型的安全发展与安全治理

2022 年底,OpenAI 推出的 ChatGPT 在文本生成领域实现了重大突破,引领了大模型技术的发展方向,推动了各式各样的基座大模型及行业大模型的发展,并逐步向多模态和具身化方向迅速演进。显然,大模型展现出的强大能力为人工智能通用化揭开了序幕。然而,大模型技术的安全性也面临着生成内容的安全性、伦理道德等重大挑战。只有积极确保大模型的安全性,才能更有效地推动其持续发展,进而更好地应对大模型技术变革所带来的机遇与挑战。

qq_41432686的博客 2583

Go语言(Golang)高并发处理思路

Go语言作为新兴的语言,最近发展势头很是迅猛,其最大的特点就是原生支持并发。它使用的是“协程(goroutine)模型”,和传统基于 OS 线程和进程实现不同,Go语言的并发是基于用户态的并发,这种并发方式就变得非常轻量,能够轻松运行几万并发逻辑。Go 的并发属于 CSP 并发模型的一种实现,CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通 过通信来共享内存”。这在 Go 语言中的实现就是 Goroutine 和 Channel。 1、场景描述 在一些场景下,有大规模请求(十万...

weixin_42117918的博客 1万+

【地图模块算法】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、gmapping算法建图【基于Raoo-Blackwellized粒子滤波(RBPF)算法】1.gmapping理论(1)gmapping的工作原理(2)gmapping的算法流程(3)gmapping论文理论2.gmappingROS工程框架解析(1)gmapping的功能包架构(2)gmapping订阅和发布的话题(3)gmapping算法建图参数(4)gmapping源码

qq_35635374的博客 3437

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

第09章 Go语言并发,Golang并发

并发指在同一时间内可以执行多个任务。并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等。本章讲解的并发含义属于多线程编程。 Go 语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go 语言的并发通过goroutine特性完成。goroutine 类似于线程,但是可以根据需要创建多个 goroutine 并发工作。goroutine 是由 Go 语言的运行时调度完成,而线程是由操作系统调度完成。 Go 语言还提供channel在多个 goroutine 间进行通信。gor...

心情第一 1401

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载

下载Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫)  下载地址:请加QQ:397245854   Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言。2015,Go迎来了全迸发的一年。时隔一年,回头再看,Go已跻身主流编程语言行列。在国内,Go的热度更是不凡。七牛云、百度、滴滴等一线互

hua397245854的专栏 7829

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Go语言(Golang)如何处理高并发?

当一个goroutine阻塞时(例如,等待channel中的数据),Go运行时会自动将其挂起,并调度其他可用的goroutine执行,从而充分利用CPU资源。与传统的线程不同,goroutines非常轻量,它们的创建和销毁成本极低,这使得在Go应用中可以轻易地创建成千上万个并发执行的goroutines。Go语言在设计之初就充分考虑了并发性,通过引入轻量级的线程——goroutines和高效的通信机制——channels,为开发者提供了一种简洁而强大的并发编程模型。来自:www.kykzl.com。

2401_84297774的博客 1763

【Golang】Go语言中的并发模式

这些模式是编写Go语言并发程序的基础。每种模式都有其使用场景、优点和缺点,您可能会发现结合多种模式可以为您的应用程序提供最佳解决方案。仔细考虑应用程序的具体需求,并选择合适的模式。

qq_40205510的博客 224

golang笔记16--go语言并发版爬虫

golang笔记16--go 语言并发版爬虫1 介绍2 并发版爬虫2.1 并发版爬虫架构2.2 简单调度器2.3 并发调度器2.4 队列实现调度器2.5 重构和总结2.6 更多城市2.7 更多用户与去重3 注意事项4 说明 1 介绍 本文继上文 golang笔记15-go 语言单任务版爬虫, 进一步了解 go 语言并发版爬虫项目,以及相应注意事项。 具体包括: 并发版爬虫架构、简单调度器、并发调度器、队列实现调度器、重构和总结、更多城市、更多用户与去重 等内容。 2 并发版爬虫 2.1 并发版爬虫架构  

脚步不能达到的地方,眼光可以达到;眼光不能达到的地方,精神可以飞到 919

Go 语言为什么这么快,带你详细了解Golang CSP并发模型

go语言的最大两个亮点,一个是goroutine,一个就是chan了。二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP。 一、CSP是什么 CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,是一个很强大的并发数据模型,是上个世纪七十年代提出的,用于描述两个独立...

阿俊的博客 2248

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

go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 【锁】详解区分 互斥锁、⾃旋锁、读写锁、乐观锁、悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号量 数据结构: type Mutex struct { state int32 sema uint32 } 上述两个加起来只占 8 字节空间的结构体表示了 Go语言中的互斥锁 状态: 在默认情况下,互斥锁的所有状态位都是 0,int32 中的不同位分别表示了不同的状态: 1位表示是否被锁定 1位

weixin_45901764的博客 1022

Go语言并发,Golang并发

并发指在同一时间内可以执行多个任务。并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等。本章讲解的并发含义属于多线程编程。 Go 语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go 语言的并发通过 goroutine 特性完成。goroutine 类似于线程,但是可以根据需要创建多个 goroutine 并发工作。goroutine 是由 Go 语言的运行时调度完成,而线程是由操作系统调度完成。 Go 语言还提供 channel 在多个 goroutine 间进行通信。gor

技术宅拯救世界 146

golang mysql并发_17Go 语言——几个并发模式

并发模式要想写出高效简单的并发程序,还需要了解下常用的 goroutine和channel以哪种方式写,下面介绍3种常用的并发模式,写出更简化高效的并发。1、runnerRunner 模式可以理解为执行者,也就是来控制程序的执行,它可以去执行任何程序,程序都是受监控的,可以去终止这些程序。当我们需要调度后台处理任务程序的时候,这种模式很拥有。简单说就是,控制 、执行,中断、退出。创建 Runner...

weixin_34122532的博客 675

【golang学习之旅】Go 语言并发编程(goroutine、channel 的使用)

✅ 适合人群:Golang 开发者 | 并发编程初学者 | 后端开发工程师✅ 文章亮点:深入解析 Goroutine & Channel + 代码示例 + 实战场景✅ 目标:掌握 Go 并发编程核心,让你的代码更高效、更强大!Goroutine是Go语言的轻量级线程,由Go运行时管理,而非操作系统。相比传统线程,Goroutine占用内存小:默认仅2KB栈空间,可动态扩展调度高效:Go运行时管理Goroutine的调度,无需手动创建线程启动成本低:创建Goroutine比创建线程的开销小很多。

程序员林北北的博客 1253

Go 语言(Golang)并发编程通俗易懂案例

Go 语言(Golang)天生支持并发编程,它的并发模型基于轻量级的 goroutine 和通信顺序进程(CSP)的思想。Goroutine 是 Go 语言中的并发执行单元,通过通道(channel)来实现不同 goroutine 之间的通信。

weixin_43425950的博客 881
上一篇: Go语言的面向对象
下一篇: 使用OAuth2实现单点登录
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值