协程并发(并行)资源竞争问题 | 学习笔记

简介: 快速学习协程并发(并行)资源竞争问题

开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程协程并发(并行)资源竞争问题】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9751


协程并发(并行)资源竞争问题

一,channel(管道)-看个需求

把这些数的阶层放入到 map 中,最后显示出来要求使用 go green 来完成。实际上它就是用携程去做,使用这个greeting 来完成效率高,但是会出现一个并发和并行安全的问题。使用第一步,使用 growth 来完成,看看 growing并发会出现什么问题。然后去解决第一步。第二步,再运行某个程序时,如何知道是否存在资源竞争的问题。这个资源竞争怎么去做,在编译的时候,可以加个 race,这个时候我们还是新建一个文件夹。

需求:现在要计算1-200的各个数的阶乘,并且把各个数的阶乘放入到 map 中。最后显示出来。要求使用 goroutine 完成
分析思路:
使用 goroutine 来完成,效率高,但是会出现并发/并行安全问题,2) 这里就提出了不同 goroutine 如何通信的问题。
代码实现
使用 goroutine 来完成(看看使用 gorotine 并发完成会出现什么问题然后去解决)
在运行某个程序时,如何知道是否存在资源竞争问题。方法很简单,在编译该程序时,增加一个参数 race 即可。

第一步:先填需求

package mainimport  ("fmt”


//需求:现在要计算1-200的各个数的阶乘,并且把各个数的阶乘放入到 map 中。
//最后显示出来。要求使用 goroutine 完成
说明思路:

1.编写一个函数,来计算各个数的阶乘,并放入到 map 中.
2.我们启动的协程多个,统计的将结果放入到 map 
3. map 应该做出一个全局的.

第二步:将得到的结果放进去
var (myMap = make(map[int]int, 10)

第三步:如何将数传进去

//test 函数就是计算 n!, 让将这个结果放入到 myMap
func test() {

res : = 1res * = 1for i : = 1; I <= n; i++ {

}

//这里我们将 res 放入到 myMap

说明:这里容易出现保护机制

myMap[n] = res //concurrent  map writes?

}func main() {

说明:将 n 往 map 里放,

第四步:有多少个任务填多少个

//我们这里开启多个协程完成这个任务[200个]
for i : = 1; I <= 200; i++ {

go test(i)

}

说明:相当于有200个来进行工作

//这里我们输出结果,变量这个结果
for i, v  :=  range myMap{fmt.Printf("map[%d]=%d\n", i, v)

}

}

最后运行时可能错误

在第四步加入:

//休眠10秒钟【?】

time.sleep(time.second*10)

image.png

输出结果会出现一个经典错误

map[19]=0map[74]=0map[40]=-70609262346240000map[90]=0map[132]=0map[2001]=0map[153]=0map[166]=0map[18]=6402373705728000map[50]=-3258495067890909184mmap[122 ]=0map[129]=0map[159]=0map[77]=0map[41]=2894979756195840000mmap[109 ]=0map[1201]=0map[133]=0map[195]m0map[151]m0Found 4 data race<s>

说明:最后说发现有四个数据就是它可以准确告诉你其实在写的数据整理有四个数据产生官网,里面写出问题没有地方。已经有结果了,但是,有四个数据,产生一个竞争关系,这个就可能出现问题来解决这个竞争关系问题。

相关文章
|
9月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
517 4
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
544 0
|
安全 Android开发 Kotlin
Android面试题之Kotlin协程并发问题和互斥锁
Kotlin的协程提供轻量级并发解决方案,如`kotlinx.coroutines`库。`Mutex`用于同步,确保单个协程访问共享资源。示例展示了`withLock()`、`lock()`、`unlock()`和`tryLock()`的用法,这些方法帮助在协程中实现线程安全,防止数据竞争。
594 1
|
监控 程序员 调度
协程实现单线程并发(入门)
协程实现单线程并发(入门)
254 1
|
监控 Devops 测试技术
Go 语言在 DevOps 中的利器:并发与协程
【8月更文挑战第31天】
290 0
|
API 调度 开发者
深入浅出Python协程:提高并发性能的秘诀
在当今快速发展的互联网时代,软件系统面临着越来越多的并发处理需求。本文将深入探讨Python中的协程(Coroutine)概念,它作为一种轻量级线程,通过优雅地在单个线程内部进行任务切换,实现高效的IO操作。本文不仅将介绍协程的基础知识和工作原理,还会通过实例演示如何在Python项目中应用协程来提高并发性能,最后将对比协程与传统多线程、多进程模型的优缺点,帮助读者更好地理解协程在现代编程中的重要性。
382 30
|
Python
深入浅出Python协程:提升并发性能的艺术
本文旨在深入探讨Python协程的内部机制及其在提升程序并发性能中的关键作用。不同于传统的摘要,我们将通过一个简洁明了的比喻来揭示协程的本质:想象一个高效的快餐厨房,厨师(主线程)在准备一个订单(任务)时,如果需要等待某个步骤(如烤面包),他会转而开始准备下一个订单,而不是站在那里等待。这样,厨房的整体效率得到了极大提升。Python协程正是这样一种机制,它允许代码在等待操作(如I/O操作)完成时“挂起”,转而执行其他任务,从而显著提高并发性能。本文将通过示例和解析,带你一步步深入理解协程的工作原理,以及如何在你的Python项目中有效地利用协程来提升性能。
276 28
|
开发者 Python
深入浅出Python协程:提高并发性能的秘诀
在现代软件开发中,提高应用程序的并发处理能力是一项挑战,尤其是在资源受限的情况下。本文将探讨Python协程的概念、原理及其在提高并发性能中的应用。通过对比传统多线程和多进程模型,我们将揭示Python协程如何以更少的资源消耗实现高效的并发任务处理。文章还将通过实例代码演示协程的创建、事件循环的管理以及异步编程的最佳实践,旨在为读者提供一种更轻量级、更高效的并发编程方法。
290 27