免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

go語言協程為什么是 go協程使用場景

2020-08-20:GO語言中的協程與Python中的協程的區別?

福哥答案2020-08-20:

創新互聯建站是由多位在大型網絡公司、廣告設計公司的優秀設計人員和策劃人員組成的一個具有豐富經驗的團隊,其中包括網站策劃、網頁美工、網站程序員、網頁設計師、平面廣告設計師、網絡營銷人員及形象策劃。承接:做網站、網站制作、網站改版、網頁設計制作、網站建設與維護、網絡推廣、數據庫開發,以高性價比制作企業網站、行業門戶平臺等全方位的服務。

1.golang的協程是基于gpm機制,是可以多核多線程的。Python的協程是eventloop模型(IO多路復用技術)實現,協程是嚴格的 1:N 關系,也就是一個線程對應了多個協程。雖然可以實現異步I/O,但是不能有效利用多核(GIL)。

2.golang用go func。python用import asyncio,async/await表達式。

評論

協程與異步IO

協程,又稱微線程,纖程。英文名 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都引入了消息調度系統模型,來避免鎖的影響和進程/線程開銷大的問題。

協程從本質上來說是一種用戶態的線程,不需要系統來執行搶占式調度,而是在語言層面實現線程的調度 。因為協程 不再使用共享內存/數據 ,而是使用 通信 來共享內存/鎖,因為在一個超級大系統里具有無數的鎖,共享變量等等會使得整個系統變得無比的臃腫,而通過消息機制來交流,可以使得每個并發的單元都成為一個獨立的個體,擁有自己的變量,單元之間變量并不共享,對于單元的輸入輸出只有消息。開發者只需要關心在一個并發單元的輸入與輸出的影響,而不需要再考慮類似于修改共享內存/數據對其它程序的影響。

Golang 線程和協程的區別

線程:

多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時的開銷,進程和線程在Linux中沒有本質區別,最大的不同就是進程有自己獨立的內存空間,而線程是共享內存空間。

在進程切換時需要轉換內存地址空間,而線程切換沒有這個動作,所以線程切換比進程切換代價要小得多。

協程:

想要簡單,又要性能高,協程就可以達到我們的目的,它是用戶視角的一種抽象,操作系統并沒有這個概念,主要思想是在用戶態實現調度算法,用少量線程完成大量任務的調度。

Goroutine是GO語言實現的協程,其特點是在語言層面就支持,使用起來十分方便,它的核心是MPG調度模型:M即內核線程;P即處理器,用來執行Goroutine,它維護了本地可運行隊列;G即Goroutine,代碼和數據結構;S及調度器,維護M和P的信息。

網站名稱:go語言協程為什么是 go協程使用場景
網頁網址:http://newbst.com/article12/dogoodc.html

成都網站建設公司_創新互聯,為您提供標簽優化網站營銷企業建站微信公眾號網站改版外貿網站建設

廣告

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

網站優化排名