欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go語言中Goroutine和協(xié)程有什么用-創(chuàng)新互聯(lián)

本篇內容介紹了“Go語言中Goroutine和協(xié)程有什么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

創(chuàng)新互聯(lián)專注骨干網(wǎng)絡服務器租用10余年,服務更有保障!服務器租用,資陽托管服務器 成都服務器租用,成都服務器托管,骨干網(wǎng)絡帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務器。

1.協(xié)程簡介

大家對于進程、線程都很熟悉,但協(xié)程就沒有火了,協(xié)程并不是Go語言特有的機制,相反像Lua、Ruby、Python、Kotlin、C/C++等也都有協(xié)程的支持,區(qū)別在于有的是從語言層面支持、有的通過插件類庫支持。Go語言是原生語言層面支持,本文也是從Go角度去理解協(xié)程。

1.1 協(xié)程基本概念和提出者

協(xié)程英文是Coroutine譯為協(xié)同程序“

協(xié)同程序是一種計算機程序組件,它允許暫停和恢復執(zhí)行,從而可以作為通用化的非搶占式多任務處理子程序。

協(xié)同程序非常適合實現(xiàn)例如協(xié)作任務、異常、事件循環(huán)、迭代器、管道等熟悉的程序組件。

根據(jù)唐納德·克努特的說法,梅爾文·康威在1958年將Coroutine這個術語應用于裝配程序的構建,直到在1963年才首次發(fā)表了闡述Coroutine的論文。

1.2 協(xié)程和進線程的對比

我們來復習一下進線程和協(xié)程的一些基本特點吧:

進程是系統(tǒng)資源分配的最小單位, 進程包括文本段text region、數(shù)據(jù)段data region和堆棧段stack region等。進程的創(chuàng)建和銷毀都是系統(tǒng)資源級別的,因此是一種比較昂貴的操作,進程是搶占式調度其有三個狀態(tài):等待態(tài)、就緒態(tài)、運行態(tài)。進程之間是相互隔離的,它們各自擁有自己的系統(tǒng)資源, 更加安全但是也存在進程間通信不便的問題。

進程是線程的載體容器,多個線程除了共享進程的資源還擁有自己的一少部分獨立的資源,因此相比進程而言更加輕量,進程內的多個線程間的通信比進程容易,但是也同樣帶來了同步和互斥的問題和線程安全問題,盡管如此多線程編程仍然是當前服務端編程的主流,線程也是CPU調度的最小單位,多線程運行時就存在線程切換問題,其狀態(tài)轉移如圖:

協(xié)程在有的資料中稱為微線程或者用戶態(tài)輕量級線程,協(xié)程調度不需要內核參與而是完全由用戶態(tài)程序來決定,因此協(xié)程對于系統(tǒng)而言是無感知的。協(xié)程由用戶態(tài)控制就不存在搶占式調度那樣強制的CPU控制權切換到其他進線程,多個協(xié)程進行協(xié)作式調度,協(xié)程自己主動把控制權轉讓出去之后,其他協(xié)程才能被執(zhí)行到,這樣就避免了系統(tǒng)切換開銷提高了CPU的使用效率。

搶占式調度和協(xié)作式調度的簡單對比:

看到這里我們不免去想:看著協(xié)作式調度優(yōu)點更多,那么為什么一直是搶占式調度占上風呢?讓我們繼續(xù)一起學習,可能就能解答這個問題了。

1.3 實際工作中的我們

我們寫程序的時經(jīng)常需要考慮的因素就是提高機器使用率,這個非常好理解。當然機器使用率和開發(fā)效率維護成本往往存在權衡,說句大白話就是:要么費人力要么費機器,選一個吧!

機器成本里面最貴的就是CPU了,程序一般分為CPU密集型和IO密集型,對于CPU密集型我們的優(yōu)化空間可能沒那么多,但對于IO密集型卻有非常大的優(yōu)化空間,試想我們的程序總是處于IO等待中讓CPU呼呼睡大覺,那該多糟糕。

為了提高IO密集型程序的CPU使用率,我們嘗試多進程/多線程編程等讓多個任務一起跑分時復用搶占式調度,這樣提高了CPU的利用率,但由于多個進線程存在調度切換,這也有一定的資源消耗,因此進線程數(shù)量不可能無限增大。

我們現(xiàn)在寫的程序大部分都是同步IO的,效率還不夠高,因此出現(xiàn)了一些異步IO框架,但是異步框架的編程難度比同步框架要大,但不可否認異步是一個很好的優(yōu)化方向,先不要暈,來看下同步IO和異步IO就知道了:

同步是指應用程序發(fā)起I/O請求后需要等待或者輪詢內核I/O操作完成后才能繼續(xù)執(zhí)行,異步是指應用程序發(fā)起I/O請求后仍繼續(xù)執(zhí)行,當內核I/O操作完成后會通知應用程序或者調用應用程序注冊的回調函數(shù)。

我們以C/C++開發(fā)的服務端程序為例,Linux的異步IO出現(xiàn)的比較晚,因此像epoll之類的IO復用技術仍然有相當大的地盤,但是同步IO的效率畢竟不如異步IO,因此當前的優(yōu)化方向包括:異步IO框架(像boost.asio框架)和協(xié)程方案(騰訊libco)。

2.Go和協(xié)程

我們知道協(xié)程是Coroutine,Go語言在語言層面對協(xié)程進行了原生支持并且稱之為Goroutine,這也是Go語言強大并發(fā)能力的重要支撐,Go的CSP并發(fā)模型是通過Goroutine和channel來實現(xiàn)的,后續(xù)會專門寫一下CSP并發(fā)模型。

2.1 協(xié)作式調度和調度器

協(xié)作式調度中用戶態(tài)協(xié)程會主動讓出CPU控制權來讓其他協(xié)程使用,確實提高了CPU的使用率,但是不由得去思考用戶態(tài)協(xié)程不夠智能怎么辦?不知道何時讓出控制權也不知道何時恢復執(zhí)行。

讀到這里忽然明白了搶占式調度的優(yōu)勢了,在搶占式調度中都是由系統(tǒng)內核來完成的,用戶態(tài)不需要參與,并且內核參與使得平臺移植好,說到底還是各有千秋啊!

為了解決這個問題我們需要一個中間層來調度這些協(xié)程,這樣才能讓用戶態(tài)的成千上萬個協(xié)程穩(wěn)定有序地跑起來,我們姑且把這個中間層稱為用戶態(tài)協(xié)程調度器吧!

2.2 Goroutine和Go的調度器模型

Go語言從2007年底開發(fā)直到今天已經(jīng)發(fā)展了12年,Go的調度器也不是一蹴而就的,在最初的幾個版本中Go的調度器也非常簡陋,無法支撐大并發(fā)。

經(jīng)過多個版本的迭代和優(yōu)化,目前已經(jīng)有很優(yōu)異的性能了,不過我們還是來回顧一下Go調度器的發(fā)展歷程。

Go的調度器非常復雜,篇幅所限本文只提一些基本的概念和原理,后續(xù)會深入去展開Go的調度器。

最近幾個版本的Go調度器采用GPM模型,其中有幾個概念先看下:

GPM模型使用一種M:N的調度器來調度任意數(shù)量的協(xié)程運行于任意數(shù)量的系統(tǒng)線程中,從而保證了上下文切換的速度并且利用多核,但是增加了調度器的復雜度。

整個GPM調度的簡單過程如下:

新創(chuàng)建的Goroutine會先存放在Global全局隊列中,等待Go調度器進行調度,隨后Goroutine被分配給其中的一個邏輯處理器P,并放到這個邏輯處理器對應的Local本地運行隊列中,最終等待被邏輯處理器P執(zhí)行即可。

在M與P綁定后,M會不斷從P的Local隊列中無鎖地取出G,并切換到G的堆棧執(zhí)行,當P的Local隊列中沒有G時,再從Global隊列中獲取一個G,當Global隊列中也沒有待運行的G時,則嘗試從其它的P竊取部分G來執(zhí)行相當于P之間的負載均衡。

“Go語言中Goroutine和協(xié)程有什么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

本文題目:Go語言中Goroutine和協(xié)程有什么用-創(chuàng)新互聯(lián)
標題網(wǎng)址:http://chinadenli.net/article2/giooc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設網(wǎng)站改版網(wǎng)站排名面包屑導航動態(tài)網(wǎng)站自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化