線程:

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、雅安服務器托管、營銷軟件、網站建設、彭山網站維護、網站推廣。
多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時的開銷,進程和線程在Linux中沒有本質區別,最大的不同就是進程有自己獨立的內存空間,而線程是共享內存空間。
在進程切換時需要轉換內存地址空間,而線程切換沒有這個動作,所以線程切換比進程切換代價要小得多。
協程:
想要簡單,又要性能高,協程就可以達到我們的目的,它是用戶視角的一種抽象,操作系統并沒有這個概念,主要思想是在用戶態實現調度算法,用少量線程完成大量任務的調度。
Goroutine是GO語言實現的協程,其特點是在語言層面就支持,使用起來十分方便,它的核心是MPG調度模型:M即內核線程;P即處理器,用來執行Goroutine,它維護了本地可運行隊列;G即Goroutine,代碼和數據結構;S及調度器,維護M和P的信息。
golang學習筆記
頻繁創建線程會造成不必要的開銷,所以才有了線程池。在線程池中預先保存一定數量的線程,新任務發布到任務隊列,線程池中的線程不斷地從任務隊列中取出任務并執行,可以有效的減少創建和銷毀帶來的開銷。
過多的線程會導致爭搶cpu資源,且上下文的切換的開銷變大。而工作在用戶態的協程能大大減少上下文切換的開銷。協程調度器把可運行的協程逐個調度到線程中執行,同時即時把阻塞的協程調度出協程,從而有效地避免了線程的頻繁切換,達到了少量線程實現高并發的效果。
多個協程分享操作系統分給線程的時間片,從而達到充分利用CPU的目的,協程調度器決定了則決定了協程運行的順序。每個線程同一時刻只能運行一個協程。
go調度模型包含三個實體:
每個處理器維護者一個協程G的隊列,處理器依次將協程G調度到M中執行。
每個P會周期性地查看全局隊列中是否有G待運行并將其調度到M中執行,全局隊列中的G主要來自系統調用中恢復的G.
如果協程發起系統調用,則整個工作線程M被阻塞,協程隊列中的其他協程都會阻塞。
一般情況下M的個數會略大于P個數,多出來的M將會在G產生系統調用時發揮作用。與線程池類似,Go也提供M池子。當協程G1發起系統掉用時,M1會釋放P,由 M1-P-G1 G2 ... 轉變成 M1-G1 , M2會接管P的其他協程 M2-P-G2 G3 G4... 。
冗余的M可能來源于緩存池,也可能是新建的。
當G1結束系統調用后,根據M1是否獲取到P,進行不用的處理。
多個處理P維護隊列可能不均衡,導致部分處理器非常繁忙,而其余相對空閑。產生原因是有些協程自身不斷地派生協程。
為此Go調度器提供了工作量竊取策略,當某個處理器P沒有需要調度的協程時,將從其他處理中偷取協程,每次偷取一半。
搶占式調度,是指避免某個協程長時間執行,而阻礙其他協程被調度的機制。
調度器監控每個協程執行時間,一旦執行時間過長且有其他協程等待,會把協程暫停,轉而調度等待的協程,以達到類似時間片輪轉的效果。比如for循環會一直占用執行權。
在IO密集型應用,GOMAXPROCS大小設置大一些,獲取性能會更好。
IO密集型會經常發生系統調用,會有一個新的M啟用或創建,但由于Go調度器檢測M到被阻塞有一定延遲。如果P數量多,則P管理協程隊列會變小。
1、學習曲線
它包含了類C語法、GC內置和工程工具。這一點非常重要,因為Go語言容易學習,所以一個普通的大學生花一個星期就能寫出來可以上手的、高性能的應用。在國內大家都追求快,這也是為什么國內Go流行的原因之一。
2、效率
Go擁有接近C的運行效率和接近PHP的開發效率,這就很有利的支撐了上面大家追求快速的需求。
3、出身名門、血統純正
之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰略考慮。而且從Go語言的發展態勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發展前途。我們看看Go語言的主要創造者,血統純正這點就可見端倪了。
4、組合的思想、無侵入式的接口
Go語言可以說是開發效率和運行效率二者的完美融合,天生的并發編程支持。Go語言支持當前所有的編程范式,包括過程式編程、面向對象編程以及函數式編程。
5、強大的標準庫
這包括互聯網應用、系統編程和網絡編程。Go里面的標準庫基本上已經是非常穩定,特別是我這里提到的三個,網絡層、系統層的庫非常實用。
6、部署方便
我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現在也有很多人用Go開發運維程序。
7、簡單的并發
它包含降低心智的并發和簡易的數據同步,我覺得這是Go最大的特色。之所以寫正確的并發、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當簡單。
8、穩定性
Go擁有強大的編譯檢查、嚴格的編碼規范和完整的軟件生命周期工具,具有很強的穩定性,穩定壓倒一切。那么為什么Go相比于其他程序會更穩定呢?這是因為Go提供了軟件生命周期的各個環節的工具,如go
tool、gofmt、go test。
協程,又稱微線程,纖程。英文名 Coroutine 。Python對協程的支持是通過 generator 實現的。在generator中,我們不但可以通過for循環來迭代,還可以不斷調用 next()函數 獲取由 yield 語句返回的下一個值。但是Python的yield不但可以返回一個值,它還可以接收調用者發出的參數。yield其實是終端當前的函數,返回給調用方。python3中使用yield來實現range,節省內存,提高性能,懶加載的模式。
asyncio是Python 3.4 版本引入的 標準庫 ,直接內置了對異步IO的支持。
從Python 3.5 開始引入了新的語法 async 和 await ,用來簡化yield的語法:
import asyncio
import threading
async def compute(x, y):
print("Compute %s + %s ..." % (x, y))
print(threading.current_thread().name)
await asyncio.sleep(x + y)
return x + y
async def print_sum(x, y):
result = await compute(x, y)
print("%s + %s = %s" % (x, y, result))
print(threading.current_thread().name)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
tasks = [print_sum(1, 2), print_sum(3, 4)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
線程是內核進行搶占式的調度的,這樣就確保了每個線程都有執行的機會。而 coroutine 運行在同一個線程中,由語言的運行時中的 EventLoop(事件循環) 來進行調度。和大多數語言一樣,在 Python 中,協程的調度是非搶占式的,也就是說一個協程必須主動讓出執行機會,其他協程才有機會運行。
讓出執行的關鍵字就是 await。也就是說一個協程如果阻塞了,持續不讓出 CPU,那么整個線程就卡住了,沒有任何并發。
PS: 作為服務端,event loop最核心的就是IO多路復用技術,所有來自客戶端的請求都由IO多路復用函數來處理;作為客戶端,event loop的核心在于利用Future對象延遲執行,并使用send函數激發協程,掛起,等待服務端處理完成返回后再調用CallBack函數繼續下面的流程
Go語言的協程是 語言本身特性 ,erlang和golang都是采用了CSP(Communicating Sequential Processes)模式(Python中的協程是eventloop模型),但是erlang是基于進程的消息通信,go是基于goroutine和channel的通信。
Python和Go都引入了消息調度系統模型,來避免鎖的影響和進程/線程開銷大的問題。
協程從本質上來說是一種用戶態的線程,不需要系統來執行搶占式調度,而是在語言層面實現線程的調度 。因為協程 不再使用共享內存/數據 ,而是使用 通信 來共享內存/鎖,因為在一個超級大系統里具有無數的鎖,共享變量等等會使得整個系統變得無比的臃腫,而通過消息機制來交流,可以使得每個并發的單元都成為一個獨立的個體,擁有自己的變量,單元之間變量并不共享,對于單元的輸入輸出只有消息。開發者只需要關心在一個并發單元的輸入與輸出的影響,而不需要再考慮類似于修改共享內存/數據對其它程序的影響。
本文題目:go語言協程為什么是,go語言中的協程
當前網址:http://www.yijiale78.com/article4/dschsie.html
成都網站建設公司_創新互聯,為您提供定制開發、用戶體驗、網站改版、Google、移動網站建設、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯