中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

wordpress 小工具 調(diào)用seo是什么崗位

wordpress 小工具 調(diào)用,seo是什么崗位,網(wǎng)絡(luò)營(yíng)銷與策劃實(shí)務(wù),網(wǎng)頁瀏覽器軟件有在學(xué)習(xí) Go 編程語言時(shí),您可能會(huì)遇到這句著名的格言:“不要通過共享內(nèi)存來進(jìn)行通信;相反,通過通信來共享內(nèi)存?!?這句話構(gòu)成了 Go 強(qiáng)大并發(fā)模型的基礎(chǔ),其中通道(channels)作為協(xié)程之間的主要通信…

在學(xué)習(xí) Go 編程語言時(shí),您可能會(huì)遇到這句著名的格言:“不要通過共享內(nèi)存來進(jìn)行通信;相反,通過通信來共享內(nèi)存?!?這句話構(gòu)成了 Go 強(qiáng)大并發(fā)模型的基礎(chǔ),其中通道(channels)作為協(xié)程之間的主要通信工具。然而,雖然通道是管理并發(fā)的多功能工具,但錯(cuò)誤地假設(shè)我們應(yīng)該始終用通道替換傳統(tǒng)的鎖定機(jī)制,如 Mutex,是一個(gè)錯(cuò)誤的觀念。在某些情況下,使用 Mutex 不僅恰當(dāng),而且比通道更有效。

在我的 Go 并發(fā)可視化系列中,今天我將通過視覺方式來解釋?sync.Mutex

Golang 基礎(chǔ)

場(chǎng)景

想象一下,有四位 Gopher 自行車手每天騎車上班。他們都需要在到達(dá)辦公室后洗個(gè)澡,但辦公室只有一個(gè)浴室。為了防止混亂,他們確保一次只能有一個(gè)人使用浴室。這種獨(dú)占式訪問的概念正是 Go Mutex(互斥鎖)的核心。

bf34c38a3f6fc9ab2d159ffe05b90bbd.png

每天早上在辦公室洗澡對(duì)自行車手和跑步者來說是一個(gè)小小的競(jìng)爭(zhēng)。

普通模式

今天最早到達(dá)的是 Stringer。當(dāng)他來的時(shí)候,沒有人在使用浴室,因此他可以立即使用浴室。

對(duì)一個(gè)未加鎖的 Mutex 調(diào)用 Lock() 會(huì)立即成功。

片刻后,Partier 到了。Partier 發(fā)現(xiàn)有人在使用浴室,但他不知道是誰,也不知道什么時(shí)候會(huì)結(jié)束使用。此時(shí),他有兩個(gè)選擇:站在浴室前面(主動(dòng)等待),或者離開并稍后再回來(被動(dòng)等待)。按 Go 的術(shù)語,前者被稱為“自旋”(spinning)。自旋的協(xié)程會(huì)占用 CPU 資源,增加了在鎖定可用時(shí)獲取 Mutex 的機(jī)會(huì),而無需進(jìn)行昂貴的上下文切換。然而,如果 Mutex 不太可能很快可用,繼續(xù)占用 CPU 資源會(huì)降低其他協(xié)程獲取 CPU 時(shí)間的機(jī)會(huì)。

從版本 1.21 開始,Golang 允許到達(dá)的協(xié)程自旋一段時(shí)間。如果在指定時(shí)間內(nèi)無法獲取 Mutex,它將進(jìn)入休眠狀態(tài),以便其他協(xié)程有機(jī)會(huì)運(yùn)行。

14dea1bc70160aedd59d555282387957.png

到達(dá)的協(xié)程首先自旋,然后休眠。

Candier 到了。就像 Partier 一樣,她試圖獲取浴室。

1713dbf0667141489a7a37329b5932b3.png

因?yàn)樗齽偟?#xff0c;如果 Stringer 很快釋放浴室,她就有很大的機(jī)會(huì)在被動(dòng)等待之前獲取它。這被稱為普通模式。

普通模式的性能要好得多,因?yàn)閰f(xié)程可以連續(xù)多次獲取 Mutex,即使有阻塞的等待者。

802c169f355683c6be50192d2c2b88c1.png
1*GJ7OW0_8z_8QjXPa2cFxPw.png

go/src/sync/mutex.go at go1.21.0 · golang/go · GitHub[1]

新到達(dá)的協(xié)程在爭(zhēng)奪所有權(quán)時(shí)具有優(yōu)勢(shì)

饑餓模式

Partier 回來了。由于他等待的時(shí)間很長(zhǎng)(超過 1 毫秒),他將嘗試以饑餓模式獲取浴室。當(dāng) Swimmer 來時(shí),他注意到有人餓了,他不會(huì)嘗試獲取浴室,也不會(huì)自旋。相反,他會(huì)排隊(duì)在等待隊(duì)列的尾部。

在這種饑餓模式下,當(dāng) Candier 結(jié)束時(shí),她會(huì)直接把浴室交給 Partier。此時(shí)沒有競(jìng)爭(zhēng)。

b37df75b60e60bc216fc9153faa06bc4.png

饑餓模式是防止尾延遲的病理情況的重要措施。

1411210b8c3edaa0fa92edf479dbc3a9.png
7d4dfe9465324ba15876a95a37811c01.png

Partier 完成了他的回合并釋放了浴室。此時(shí),只有 Swimmer 在等待,因此他將立即擁有它。Swimmer 如果發(fā)現(xiàn)自己是最后一個(gè)等待的人,他會(huì)將 Mutex 設(shè)置回普通模式。如果他發(fā)現(xiàn)自己的等待時(shí)間少于 1 毫秒,也會(huì)這樣做。

最后,Swimmer 在使用浴室后釋放了它。請(qǐng)注意,Mutex 不會(huì)將所有者從“已鎖定(由 Goroutine A 鎖定)”狀態(tài)更改為“已鎖定(由 Goroutine B 鎖定)”狀態(tài)。它始終會(huì)在“已鎖定”到“未鎖定”然后再到“已鎖定”的狀態(tài)之間切換。出于簡(jiǎn)潔起見,上面的圖像中省略了中間狀態(tài)。

展示代碼!

Mutex 的實(shí)現(xiàn)隨時(shí)間而變化,實(shí)際上,要完全理解它的實(shí)現(xiàn)并不容易。幸運(yùn)的是,我們不必完全理解其實(shí)現(xiàn)就能高效使用它。如果從這篇博客中只能記住一件事,那一定是:早到的人不一定贏得比賽。相反,新到達(dá)的協(xié)程通常具有更高的機(jī)會(huì),因?yàn)樗鼈內(nèi)栽?CPU 上運(yùn)行。Golang 還嘗試避免通過實(shí)現(xiàn)饑餓模式來使等待者被餓死。

package mainimport ("fmt""sync""time"
)func main() {wg := sync.WaitGroup{}wg.Add(4)bathroom := sync.Mutex{}takeAShower := func(name string) {defer wg.Done()fmt.Printf("%s: I want to take a shower. I'm trying to acquire the bathroom\n", name)bathroom.Lock()fmt.Printf("%s: I have the bathroom now, taking a shower\n", name)time.Sleep(500 * time.Microsecond)fmt.Printf("%s: I'm done, I'm unlocking the bathroom\n", name)bathroom.Unlock()}go takeAShower("Partier")go takeAShower("Candier")go takeAShower("Stringer")go takeAShower("Swimmer")wg.Wait()fmt.Println("main: Everyone is Done. Shutting down...")
}

正如您可能猜到的,并發(fā)代碼的結(jié)果幾乎總是非確定性的。

第一次

Swimmer: I want to take a shower. I'm trying to acquire the bathroom

Partier: I want to take a shower. I'm trying to acquire the bathroom

Candier: I want to take a shower. I'm trying to acquire the bathroom

Stringer: I want to take a shower. I'm trying to acquire the bathroom

Swimmer: I have the bathroom now, taking a shower

Swimmer: I'm done, I'm unlocking the bathroom

Partier: I have the bathroom now, taking a shower

Partier: I'm done, I'm unlocking the bathroom

Candier: I have the bathroom now, taking a shower

Candier: I'm done, I'm unlocking the bathroom

Stringer: I have the bathroom now, taking a shower

Stringer: I'm done, I'm unlocking the bathroom

main: Everyone is Done. Shutting down...

第二次

Swimmer: I want to take a shower. I'm trying to acquire the bathroom

Swimmer: I have the bathroom now, taking a shower

Partier: I want to take a shower. I'm trying to acquire the bathroom

Stringer: I want to take a shower. I'm trying to acquire the bathroom

Candier: I want to take a shower. I'm trying to acquire the bathroom

Swimmer: I'm done, I'm unlocking the bathroom

Partier: I have the bathroom now, taking a shower

Partier: I'm done, I'm unlocking the bathroom

Stringer: I have the bathroom now, taking a shower

Stringer: I'm done, I'm unlocking the bathroom

Candier: I have the bathroom now, taking a shower

Candier: I'm done, I'm unlocking the bathroom

main: Everyone is Done. Shutting down...

自己實(shí)現(xiàn) Mutex

實(shí)現(xiàn)?sync.Mutex?是困難的,但使用具有緩沖的通道來實(shí)現(xiàn) Mutex 卻相當(dāng)容易。

type MyMutex struct {ch chan bool
}func NewMyMutex() *MyMutex {return &MyMutex{// 緩沖大小必須為 1ch: make(chan bool, 1),}
}// Lock 鎖定 m。
// 如果鎖已被使用,調(diào)用的協(xié)程將被阻塞,直到 Mutex 可用。
func (m *MyMutex) Lock() {[m.ch](http://m.ch) <- true
}// Unlock 解鎖 m。
func (m *MyMutex) Unlock() {<-m.ch
}

這篇文章通過生動(dòng)的場(chǎng)景和可視化效果很好地解釋了 Go 語言中?sync.Mutex?的工作原理,以及如何使用互斥鎖來管理并發(fā)

相關(guān)系列文章

使用通信順序進(jìn)程(CSP)模型的 Go 語言通道

Go并發(fā)可視化解釋 – select語句

以可視化方式解釋 Go 并發(fā) - 通道

http://www.risenshineclean.com/news/46694.html

相關(guān)文章:

  • 山東日照建設(shè)網(wǎng)站微信小程序怎么開通
  • 做藥材生意的網(wǎng)站免費(fèi)下載百度app最新版本
  • 濟(jì)南網(wǎng)絡(luò)廣播電視臺(tái)北京關(guān)鍵詞優(yōu)化報(bào)價(jià)
  • 域名服務(wù)器的四種類型營(yíng)口seo
  • 網(wǎng)站建設(shè)需要哪些方面愛站網(wǎng)權(quán)重查詢
  • 深圳燃?xì)夤镜刂吩谀睦锕枮Iseo關(guān)鍵字優(yōu)化
  • 網(wǎng)站首頁大圖怎么做優(yōu)化推廣網(wǎng)站排名
  • 知名網(wǎng)站建設(shè)定制如何聯(lián)系百度客服
  • 電梯配件做外貿(mào)在哪個(gè)網(wǎng)站上海網(wǎng)絡(luò)推廣招聘
  • 網(wǎng)站開發(fā)調(diào)研方案中小企業(yè)網(wǎng)絡(luò)營(yíng)銷現(xiàn)狀
  • 如何做網(wǎng)站首頁百度查重
  • 網(wǎng)站代碼制作軟件網(wǎng)絡(luò)營(yíng)銷五種方法
  • wordpress國(guó)外主題慢點(diǎn)擊排名優(yōu)化
  • 網(wǎng)站后臺(tái)動(dòng)態(tài)播放怎么做的招代理最好的推廣方式
  • 網(wǎng)站如何兼容大多瀏覽器怎么注冊(cè)電商平臺(tái)
  • 溧陽網(wǎng)站設(shè)計(jì)唐山seo排名
  • 做安全題目是哪個(gè)網(wǎng)站長(zhǎng)沙百度網(wǎng)站快速排名
  • 蘇州網(wǎng)站建設(shè)設(shè)計(jì)公司免費(fèi)網(wǎng)站建設(shè)制作
  • 做內(nèi)貿(mào)只要有什么網(wǎng)絡(luò)推廣網(wǎng)站搜索引擎技術(shù)基礎(chǔ)
  • 網(wǎng)站功能測(cè)試方法怎么做好公司官網(wǎng)推廣
  • 手機(jī)怎么做網(wǎng)站免費(fèi)的百度學(xué)術(shù)官網(wǎng)入口
  • 電腦維修 做網(wǎng)站小廣告圖片
  • 網(wǎng)站建設(shè)系統(tǒng) 招標(biāo)西安百度seo推廣電話
  • 濟(jì)寧做網(wǎng)站有哪幾家職業(yè)培訓(xùn)機(jī)構(gòu)需要什么資質(zhì)
  • 招商平臺(tái)公司山西seo排名
  • 做棋牌推廣網(wǎng)站違法不網(wǎng)絡(luò)推廣站
  • 天津網(wǎng)站建設(shè)定制公司免費(fèi)seo網(wǎng)站推廣在線觀看
  • 什么視頻網(wǎng)站可以做鏈接深圳網(wǎng)站開發(fā)公司
  • 商河做網(wǎng)站多少錢my77728域名查詢
  • 做網(wǎng)站要學(xué)多久電商運(yùn)營(yíng)