日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

开启协程_「科普」什么是协程?

發(fā)布時間:2025/3/17 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开启协程_「科普」什么是协程? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
閱讀本文大概需要 6 分鐘

今天要講的這個東西說實話,我也是今天才知道,一個我們大多數(shù)人可能從來都沒用過的語法,哪就是傳說中的【協(xié)程】,英文表達是Coroutine。

可能你會說,攜程誰不知道啊,不就是哪個用來訂機票訂酒店的軟件么,這有什么好學(xué)的!這樣的話你就錯了,此協(xié)程非彼攜程,可不要傻傻分不清楚嘍!

什么是進程和線程

01 進程是什么 ?

直白地講,進程就是應(yīng)用程序的啟動實例。比如我們運行一個游戲,打開一個軟件,就是開啟了一個進程,進程擁有代碼和打開的文件資源、數(shù)據(jù)資源、獨立的內(nèi)存空間。

02 線程又是什么 ?

線程從屬于進程,是程序的實際執(zhí)行者。一個進程至少包含一個主線程,也可以有更多的子線程,線程擁有自己的棧空間。

線程具有五種狀態(tài):

對操作系統(tǒng)來說,線程是最小的執(zhí)行單元,進程是最小的資源管理單元。

無論進程還是線程,都是由操作系統(tǒng)所管理的。

進程和線程的痛點

線程之間是如何進行協(xié)作的呢?

最經(jīng)典的例子就是生產(chǎn)者/消費者模式

若干個生產(chǎn)者線程向隊列中寫入數(shù)據(jù),若干個消費者線程從隊列中消費數(shù)據(jù)。

什么是協(xié)程

官方定義如下:

A coroutine is a function that can suspend its execution (yield) until the given given YieldInstruction finishes.

用我蹩腳的英語來翻譯一下就是:

協(xié)程是一種可以暫停執(zhí)行過程的函數(shù),它可以中斷當(dāng)前的執(zhí)行過程直到下一個 Yield 指令達成。

我的理解是可以把它當(dāng)成為類似 于CPU 在多個進程間切換,從而達到多個進程同時執(zhí)行的效果。協(xié)程是一種比線程更加輕量級的存在,一個進程可以擁有多個線程,一個線程也可以擁有多個協(xié)程。

學(xué)過計算機組成原理的都知道,當(dāng) CPU 在多個進程間切換時,那些后臺程序就會處于這種暫停用英文的 Suspend 或許更恰當(dāng))的狀態(tài),所以早年的電腦即使用一個 CPU 也可以同時處理多個進程任務(wù),這是一種“偽多線程”的技術(shù)。

除此之外比較重要的一點是,協(xié)程不是被操作系統(tǒng)內(nèi)核所管理,而完全是由程序所控制(也就是在用戶態(tài)執(zhí)行)。這樣帶來的好處就是性能得到了很大的提升,不會像線程那樣需要上下文切換來消耗資源,因此協(xié)程的開銷遠遠小于線程的開銷

注意,這里要劃一個重點,協(xié)程是一種“偽多線程”,始終記得這一點,可以幫助我們來理解協(xié)程會這個概念。

協(xié)程函數(shù)的寫法

Java 語言并沒有對協(xié)程提供原生支持,所以用 Java 暫時還演示不了,但是有個開源框架基本模擬除了協(xié)程的功能,感興趣的朋友可以去看看源碼。。。

地址 :https://github.com/kilim/kilim

Go 語言根據(jù)我查詢資料來看,對于協(xié)程的支持超乎我的想象,可以說是強大而簡潔,輕輕松松分分鐘創(chuàng)建成百上千個協(xié)程并發(fā)執(zhí)行。

func Add(x, y int) { z := x + y fmt.Println(z)}func main() { for i:=0; i<10; i++ { go Add(i, i) }}

如上代碼,在一個函數(shù)調(diào)用前加上 go 關(guān)鍵字,這次調(diào)用就會在一個新的協(xié)程中并發(fā)執(zhí)行。當(dāng)被調(diào)用的函數(shù)返回時,這個協(xié)程也自動結(jié)束。需要注意的是,如果這個函數(shù)有返回值,那么這個返回值會被丟棄。

Python 語言也可以通過 yield/send 的方式實現(xiàn)協(xié)程。在 python 3.5 以后,async/await 成為了更好的替代方案。

def consume():while True:# consumer 協(xié)程等待接收數(shù)據(jù)number = yieldprint("開始消費

總結(jié)

以上是生活随笔為你收集整理的开启协程_「科普」什么是协程?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。