第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Golang 并發(fā)編程(sync實(shí)現(xiàn))

標(biāo)簽:
Go 面試

go 并发编程

Golang 提供 syncchannel 两种实现方式支持协程(goroutine)并发。

例如我们举个并发下载资源的例子,实现两种并发编程:

package main

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

func main()  {
	// ============== sync ==============
	startTime1 := time.Now()

	testGoroutine()

	endTime1 := time.Now()
    // 可以看到串行需要 3s 的下载操作,并发后,只需要 1s
	fmt.Printf("======> Done! use time: %f",(endTime1.Sub(startTime1).Seconds()))
	fmt.Println()
}

// 使用 sync.WaitGroup 多个并发协程之间不能通信, 等待所有并发协程执行结束
var wg sync.WaitGroup
func testGoroutine() {
	for i:=0; i<3; i++ {
		wg.Add(1) // wg.Add() 为 wg 添加一个计数; wg.Done() 减去一个计数。
		go downloadV1("a.com/time_"+string(i+'0'))	// 启动新的协程并发执行 download 函数。
	}

	wg.Wait()	// wg.Wait():等待所有的协程执行结束。
}


// ================= 工具 V  =================
func downloadV1(url string) {
	fmt.Println("start to download", url)
	time.Sleep(time.Second) // 模拟耗时

	wg.Done()
}

下面我们就来详细说说 两种并发实现方式

sync.WaitGroup(等待组)

sync.WaitGroup 类型中,每个WaitGroup都在内部维护着一个计数(初始值为0)。
如果多个并发协程间不需要通信,那么非常适合使用 sync.WaitGroup,等待所有并发协程执行结束。
sync.WaitGroup 常用的方法如下:

  • (wg * WaitGroup) Add(delta int) 等待组的计数器 +1
  • (wg * WaitGroup) Done() 等待组的计数器 -1
  • (wg * WaitGroup) Wait() 当等待组计数器不等于 0 时阻塞直到变 0。

sync.WaitGroup(等待组)内部维持着一个计数器,计数器的值可以通过方法调用实现计数器的增加和减少。当我们添加了 N 个并发任务进行工作时,就将等待组的计数器值增加 N。每个任务完成时,这个值减 1。同时,在另外一个 goroutine 中等待这个等待组的计数器值为 0 时,表示所有任务已经完成。
使用步骤如下:

  • 协程开始时使用 wg.Add() 给等待组的计数 +1。
  • 协程开始时使用 wg.Done() 给等待组的计数 -1。
  • wg.Done()wg.Add(-1) 完全等价。但如果将 wg 维护的计数更改成负数,将产生panic(恐慌)
  • 协程调用了 wg.Wait() 时,
    • 此时 wg 维护的计数为 0,则此 wg.Wait() 此操作为空操作(noop)
    • 计数为正整数,此协程将进入阻塞状态等待其他协程执行。当其它协程将此计数更改至 0 时,此协程 wg.Wait() 将返回。
點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
全棧工程師
手記
粉絲
154
獲贊與收藏
1427

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消