![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go并发编程
文章平均质量分 69
Go并发编程
Kevin_cai09
无情的bug maker
展开
-
Go并发编程(八)go定时器
文章目录Go并发编程(八)go定时器标准定时器timer循环定时器TickGo并发编程(八)go定时器Go的标准包time里提供了两种定时器,一种是标准定时器,另一种是循环定时器。标准定时器timertimer在到达指定时间时仅仅触发一次,当timer到期时会将当前时间发送到自己的C管道,timer实例必须通过NewTimer或AfterFunc timer := time.NewTimer(time.Second * 3)延迟执行:第一种实现time.sleep(3 * time.Sec原创 2021-05-01 23:39:12 · 417 阅读 · 0 评论 -
Go并发编程(七)go爬虫小案例
文章目录Go并发编程(七)go爬虫小案例系统流程图文件下载ioutil 简单使用爬虫获取图片链接完整代码Go并发编程(七)go爬虫小案例系统流程图文件下载// 图片下载func DownloadImg() { index := 0 for url := range chanImageString{ ok := DownFile(url,"file_" + strconv.Itoa(index)) if ok{ fmt.Println("下载成功:",url) }else{原创 2021-05-01 23:38:33 · 277 阅读 · 0 评论 -
Go并发编程(六)atomic包
文章目录Go并发编程(六)atomic包使用CASswap原理Go并发编程(六)atomic包代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。使用func TestMyAtomic() { // 写入 var a int64 atomic.StoreInt64(&a,10)原创 2021-05-01 23:38:02 · 286 阅读 · 0 评论 -
Go并发编程(五)同步锁Mutex&读写锁RWMutex
文章目录Go并发编程(五)同步锁Mutex&读写锁RWMutexMutex使用原理RWMutex使用原理Go并发编程(五)同步锁Mutex&读写锁RWMutexMutex使用Mutex是go中实现的同步锁,保证了同一时间只有一个goroutine执行func TestLock(mutex *sync.Mutex) { fmt.Println("主协程 start") time.Sleep(2 * time.Second) for i := 0;i < 10;i++{原创 2021-05-01 23:37:31 · 251 阅读 · 0 评论 -
Go并发编程(三)context&waitgroup
文章目录Go并发编程(三)context&waitgroup使用ContextWaitGroupContext使用场景请求链路传值主动和超时取消请求Go并发编程(三)context&waitgroup控制并发的方式有两种:使用WaitGroup通过WaitGroup等待所有goroutine执行完在执行别的事使用ContextWaitGroupwaitGroup会等待所有的goroutine执行完后在执行其他的事import ( "fmt" "sync"原创 2021-05-01 23:37:00 · 298 阅读 · 0 评论 -
Go并发编程(三)协程池
文章目录Go并发编程(三)协程池为什么需要协程池实现数据结构定义新增任务&执行任务goroutine异常处理关闭协程池使用Go并发编程(三)协程池本文参考如下博客实现了一个简易的协程池100 行写一个 go 的协程池 (任务池)为什么需要协程池goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine实现实现的基本思路是采用生产者-消费者模型,用来执行任务的goroutine原创 2021-05-01 23:36:29 · 567 阅读 · 0 评论 -
Go并发编程(二)Channel
文章目录Go并发编程(二)Channelchannel通信机制使用实现原理Go并发编程(二)Channelchannel通信机制在go中推荐使用基于消息的并发通信,而不是通过共享内存,通过channel机制,实现goroutine相互通信channel是进程内的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。使用通过channel机制,实现goroutine相互通信,管道是类型相关的,即一个管道只能传递一种类型的值。管道中的数据是先进先出的。func原创 2021-05-01 23:35:58 · 169 阅读 · 0 评论 -
Go并发编程(一)Goroutine
文章目录Go并发编程(一)Goroutine进程&线程&协程Go调度模型goroutine GMP调度模型整体调度流程基本使用Go并发编程(一)Goroutine进程&线程&协程进程进程是程序和数据的一次动态执行的过程,是CPU资源的分配的基本的单位,进程的局限是进程的创建,撤销和切换的开销较大线程线程是进程之后发展出来的概念,也叫轻量级进程,是CPU调度的最小单位,线程需要共享同进程内的进程资源,创建,撤销和切换的代价小于进程协程协程是一种用户态的轻量级线程原创 2021-04-30 02:23:17 · 247 阅读 · 1 评论