真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言解決并發(fā),go并發(fā)框架

Go CSP并發(fā)模型

Go的CSP并發(fā)模型

創(chuàng)新互聯(lián)建站專注于秭歸網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供秭歸營(yíng)銷型網(wǎng)站建設(shè),秭歸網(wǎng)站制作、秭歸網(wǎng)頁(yè)設(shè)計(jì)、秭歸網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造秭歸網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供秭歸網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

Go實(shí)現(xiàn)了兩種并發(fā)形式。第一種是大家普遍認(rèn)知的:多線程共享內(nèi)存。其實(shí)就是Java或者C++等語(yǔ)言中的多線程開發(fā)。另外一種是Go語(yǔ)言特有的,也是Go語(yǔ)言推薦的:CSP(communicating sequential processes)并發(fā)模型。

CSP 是 Communicating Sequential Process 的簡(jiǎn)稱,中文可以叫做通信順序進(jìn)程,是一種并發(fā)編程模型,由 Tony Hoare 于 1977 年提出。簡(jiǎn)單來(lái)說(shuō),CSP 模型由并發(fā)執(zhí)行的實(shí)體(線程或者進(jìn)程)所組成,實(shí)體之間通過(guò)發(fā)送消息進(jìn)行通信,這里發(fā)送消息時(shí)使用的就是通道,或者叫 channel。CSP 模型的關(guān)鍵是關(guān)注 channel,而不關(guān)注發(fā)送消息的實(shí)體。 Go 語(yǔ)言實(shí)現(xiàn)了 CSP 部分理論 。

“ 不要以共享內(nèi)存的方式來(lái)通信,相反, 要通過(guò)通信來(lái)共享內(nèi)存?!?/p>

Go的CSP并發(fā)模型,是通過(guò) goroutine和channel 來(lái)實(shí)現(xiàn)的。

goroutine 是Go語(yǔ)言中并發(fā)的執(zhí)行單位。其實(shí)就是協(xié)程。

channel是Go語(yǔ)言中各個(gè)并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機(jī)制。 通俗的講,就是各個(gè)goroutine之間通信的”管道“,有點(diǎn)類似于Linux中的管道。

Channel

Goroutine

【golang】高并發(fā)下TCP常見(jiàn)問(wèn)題解決方案

首先,看一下TCP握手簡(jiǎn)單描繪過(guò)程:

其握手過(guò)程原理,就不必說(shuō)了,有很多詳細(xì)文章進(jìn)行敘述,本文只關(guān)注研究重點(diǎn)。

在第三次握手過(guò)程中,如果服務(wù)器收到ACK,就會(huì)與客戶端建立連接,此時(shí)內(nèi)核會(huì)把連接從半連接隊(duì)列移除,然后創(chuàng)建新的連接,并將其添加到全連接隊(duì)列,等待進(jìn)程調(diào)用。

如果服務(wù)器繁忙,來(lái)不及調(diào)用連接導(dǎo)致全連接隊(duì)列溢出,服務(wù)器就會(huì)放棄當(dāng)前握手連接,發(fā)送RST給客戶端,即connection reset by peer。

在linux平臺(tái)上,客戶端在進(jìn)行高并發(fā)TCP連接處理時(shí),最高并發(fā)數(shù)量都要受系統(tǒng)對(duì)用戶單一進(jìn)程同時(shí)打開文件數(shù)量的限制(這是因?yàn)橄到y(tǒng)每個(gè)TCP都是SOCKET句柄,每個(gè)soker句柄都是一個(gè)文件),當(dāng)打開連接超過(guò)限制,就會(huì)出現(xiàn)too many open files。

使用下指令查看最大句柄數(shù)量:

增加句柄解決方案

Go并發(fā)編程之美-CAS操作

摘要: 一、前言 go語(yǔ)言類似Java JUC包也提供了一些列用于多線程之間進(jìn)行同步的措施,比如低級(jí)的同步措施有 鎖、CAS、原子變量操作類。相比Java來(lái)說(shuō)go提供了獨(dú)特的基于通道的同步措施。本節(jié)我們先來(lái)看看go中CAS操作 二、CAS操作 go中的Cas操作與java中類似,都是借用了CPU提供的原子性指令來(lái)實(shí)現(xiàn)。

go語(yǔ)言類似Java JUC包也提供了一些列用于多線程之間進(jìn)行同步的措施,比如低級(jí)的同步措施有 鎖、CAS、原子變量操作類。相比Java來(lái)說(shuō)go提供了獨(dú)特的基于通道的同步措施。本節(jié)我們先來(lái)看看go中CAS操作

go中的Cas操作與java中類似,都是借用了CPU提供的原子性指令來(lái)實(shí)現(xiàn)。CAS操作修改共享變量時(shí)候不需要對(duì)共享變量加鎖,而是通過(guò)類似樂(lè)觀鎖的方式進(jìn)行檢查,本質(zhì)還是不斷的占用CPU 資源換取加鎖帶來(lái)的開銷(比如上下文切換開銷)。下面一個(gè)例子使用CAS來(lái)實(shí)現(xiàn)計(jì)數(shù)器

go中CAS操作具有原子性,在解決多線程操作共享變量安全上可以有效的減少使用鎖所帶來(lái)的開銷,但是這是使用cpu資源做交換的。

我簡(jiǎn)單列舉了并發(fā)編程的大綱,需要詳細(xì)的私信“555”~~

Go語(yǔ)言——goroutine并發(fā)模型

參考:

Goroutine并發(fā)調(diào)度模型深度解析手?jǐn)]一個(gè)協(xié)程池

Golang 的 goroutine 是如何實(shí)現(xiàn)的?

Golang - 調(diào)度剖析【第二部分】

OS線程初始棧為2MB。Go語(yǔ)言中,每個(gè)goroutine采用動(dòng)態(tài)擴(kuò)容方式,初始2KB,按需增長(zhǎng),最大1G。此外GC會(huì)收縮??臻g。

BTW,增長(zhǎng)擴(kuò)容都是有代價(jià)的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問(wèn)題。

更多關(guān)于stack的內(nèi)容,可以參見(jiàn)大佬的文章。 聊一聊goroutine stack

用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語(yǔ)言自己實(shí)現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。

Go語(yǔ)言采用兩級(jí)線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會(huì)交給OS線程執(zhí)行,但是需要一個(gè)中介,提供上下文。這就是G-M-P模型

Go調(diào)度器有兩個(gè)不同的運(yùn)行隊(duì)列:

go1.10\src\runtime\runtime2.go

Go調(diào)度器根據(jù)事件進(jìn)行上下文切換。

調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進(jìn)程切換。

詳見(jiàn) Golang - 調(diào)度剖析【第二部分】

Linux可以通過(guò)epoll實(shí)現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。

文件IO操作

上面都是防止M堵塞,任務(wù)竊取是防止M空閑

每個(gè)M都有一個(gè)特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務(wù),所以g0的棧稱為調(diào)度棧。g0的棧不會(huì)自動(dòng)增長(zhǎng),不會(huì)被gc,來(lái)自os線程的棧。

go1.10\src\runtime\proc.go

G沒(méi)辦法自己運(yùn)行,必須通過(guò)M運(yùn)行

M通過(guò)通過(guò)調(diào)度,執(zhí)行G

從M掛載P的runq中找到G,執(zhí)行G


網(wǎng)頁(yè)題目:go語(yǔ)言解決并發(fā),go并發(fā)框架
當(dāng)前鏈接:http://weahome.cn/article/hsoejs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部