關(guān)于并發(fā)未來(lái)的深度對(duì)話)
文章目錄引言一、Golang Goroutine二、C20 Coroutine三、Coroutine 媲美Goroutine四、Coroutine 的影響力五、結(jié)語(yǔ)摘要C20 Coroutine 和 Golang Goroutine 是現(xiàn)代編程語(yǔ)言解決并發(fā)和異步編程復(fù)雜性的重要原語(yǔ)。Goroutine 是 Go 語(yǔ)言的內(nèi)置特性易用、運(yùn)行時(shí)調(diào)度簡(jiǎn)化高并發(fā)應(yīng)用的開發(fā)。C20 Coroutine 是語(yǔ)言層面的低成本抽象為 C 提供構(gòu)建高性能異步庫(kù)和框架的強(qiáng)大基石。引言基于操作系統(tǒng)線程的并發(fā)模型雖然強(qiáng)大但有著非常大的資源開銷、復(fù)雜的同步機(jī)制、很難調(diào)試的競(jìng)態(tài)條件“回調(diào)地獄”和上下文切換性能瓶頸。異步編程通過事件循環(huán)、回調(diào)函數(shù)、Future/Promise 等機(jī)制不阻塞主線程的情況處理耗時(shí)操作但代碼可讀性和維護(hù)性就不那么盡如人意了。因此輕量級(jí)并發(fā)原語(yǔ)協(xié)程逐漸嶄露頭角成為優(yōu)雅方案。用接近同步代碼的直觀方式編寫異步邏輯同時(shí)降低資源消耗和上下文切換的開銷。其中Golang 的 Goroutine 和 C20 標(biāo)準(zhǔn)引入的 Coroutine 是各自語(yǔ)言生態(tài)最具代表性的輕量級(jí)并發(fā)模型都承諾能最大簡(jiǎn)化并發(fā)編程提升應(yīng)用性能。雖然目標(biāo)相似C20 Coroutine 和 Golang Goroutine 的設(shè)計(jì)理念、底層實(shí)現(xiàn)、以及對(duì)語(yǔ)言生態(tài)的影響力上卻大相徑庭。Goroutine 是 Go 語(yǔ)言的核心特性開箱即用、由運(yùn)行時(shí)全面管理的并發(fā)解決方案C Coroutine 只提供構(gòu)建極致性能異步框架的底層工具。這篇文章對(duì)這兩種截然不同的輕量級(jí)并發(fā)原語(yǔ)進(jìn)行深入的技術(shù)對(duì)比剖析優(yōu)勢(shì)和局限特別是 C20 Coroutine 在技術(shù)能力上能否跟 Goroutine 匹敵以及是否能像 Goroutine 那樣對(duì) C 社區(qū)乃至整個(gè)軟件行業(yè)帶來(lái)同等量級(jí)的范式轉(zhuǎn)變和深遠(yuǎn)影響力。一、Golang GoroutineGolang 是一門為并發(fā)而生的語(yǔ)言并發(fā)是一等公民。Go 語(yǔ)言的 Goroutine 是實(shí)現(xiàn)并發(fā)編程的基礎(chǔ)簡(jiǎn)化高并發(fā)應(yīng)用的開發(fā)。Go 語(yǔ)言在設(shè)計(jì)之初就把并發(fā)視為核心競(jìng)爭(zhēng)力并發(fā)即服務(wù)。摒棄多線程編程的復(fù)雜性而是利用 Tony Hoare 提出的通信順序進(jìn)程 (Communicating Sequential Processes, CSP)模型。這一模型的思想是“不要通過共享內(nèi)存來(lái)通信而要通過通信來(lái)共享內(nèi)存”。Go 語(yǔ)言的 Goroutine 之間通過Channel通道進(jìn)行數(shù)據(jù)交換和同步而不是直接操作共享變量并依賴復(fù)雜的鎖機(jī)制。從根本上避免傳統(tǒng)并發(fā)編程常見的死鎖、競(jìng)態(tài)條件等問題。Goroutine 的實(shí)現(xiàn)機(jī)制跟操作系統(tǒng)線程不同一個(gè) Goroutine 初始時(shí)僅占用極小的棧空間幾 KB。這個(gè)棧空間可以根據(jù)需要?jiǎng)討B(tài)增長(zhǎng)和收縮避免不必要的內(nèi)存浪費(fèi)所以 Go 程序可以輕松創(chuàng)建成千上萬(wàn)個(gè) Goroutine。運(yùn)行時(shí)調(diào)度M:N 模型Goroutine 不直接映射到操作系統(tǒng)線程。Go 語(yǔ)言有一個(gè)內(nèi)置的運(yùn)行時(shí)調(diào)度器負(fù)責(zé)把大量的 Goroutine (M) 多路復(fù)用到少量的操作系統(tǒng)線程 (N) 上。這個(gè)調(diào)度器是用戶態(tài)的可以在 Goroutine 執(zhí)行 I/O 操作、等待 Channel 通信或進(jìn)行函數(shù)調(diào)用等時(shí)機(jī)自動(dòng)暫停當(dāng)前 Goroutine 并切換到另一個(gè)可運(yùn)行的 Goroutine不用操作系統(tǒng)內(nèi)核的介入。這種 M:N 調(diào)度模型很大程度的減少上下文切換的開銷提高 CPU 利用率。每個(gè) Goroutine 都有自己的獨(dú)立調(diào)用棧。Goroutine 可以在任何函數(shù)調(diào)用點(diǎn)暫停和恢復(fù)局部變量和執(zhí)行上下文都保存在自己的棧內(nèi)。這種“棧式”的特性讓 Goroutine 的編程模型非常直觀像編寫同步代碼一樣編寫并發(fā)邏輯不用擔(dān)心狀態(tài)的保存和恢復(fù)。通信機(jī)制Channel。Channel 是 Goroutine 之間進(jìn)行安全通信和同步的主要方式。是一種類型安全的管道可以一個(gè) Goroutine 向其發(fā)送數(shù)據(jù)另一個(gè) Goroutine 從中接收數(shù)據(jù)。Channel 可以是帶緩沖的或不帶緩沖的提供天然的同步點(diǎn)確保數(shù)據(jù)在并發(fā)環(huán)境有序和正確傳遞。Go 語(yǔ)言還提供select語(yǔ)句同時(shí)監(jiān)聽多個(gè) Channel 的操作實(shí)現(xiàn)復(fù)雜的并發(fā)控制邏輯。Goroutine 的優(yōu)勢(shì)創(chuàng)建 Goroutine 的語(yǔ)法極其簡(jiǎn)單只要在函數(shù)調(diào)用前加上go關(guān)鍵字。這種直觀的語(yǔ)法大大降低并發(fā)編程的門檻。不用關(guān)心線程池管理、鎖機(jī)制、死鎖預(yù)防等復(fù)雜問題只要關(guān)注業(yè)務(wù)邏輯和數(shù)據(jù)流。Goroutine 結(jié)合 Channel 的模型讓并發(fā)代碼的編寫和理解變得更加容易。內(nèi)置調(diào)度器Go 運(yùn)行時(shí)自動(dòng)管理 Goroutine 的生命周期、調(diào)度和上下文切換不用手動(dòng)編寫復(fù)雜的調(diào)度邏輯。所以 Go 程序能充分利用多核處理器同時(shí)保持良好的可伸縮性。Go 語(yǔ)言的標(biāo)準(zhǔn)庫(kù)和龐大的第三方庫(kù)都對(duì) Goroutine 和 Channel 有原生、良好的支持構(gòu)建復(fù)雜的并發(fā)應(yīng)用輕而易舉。Goroutine 的局限運(yùn)行時(shí)依賴Goroutine 的性能和行為高度依賴 Go 運(yùn)行時(shí)。對(duì)運(yùn)行時(shí)開銷有極致要求或者要完全控制底層內(nèi)存布局和調(diào)度策略的場(chǎng)景Go 語(yǔ)言的抽象層級(jí)就不夠低。一定程度的抽象雖然 Goroutine 提供高效的并發(fā)但畢竟是 Go 語(yǔ)言運(yùn)行時(shí)提供的一種抽象。不能像 C 那樣直接操作寄存器、手動(dòng)管理協(xié)程幀實(shí)現(xiàn)極致的底層控制和“零開銷”抽象。Golang 的 Goroutine 擅長(zhǎng)場(chǎng)景網(wǎng)絡(luò)服務(wù)和微服務(wù)構(gòu)建高并發(fā)的 Web 服務(wù)器、API 網(wǎng)關(guān)和分布式服務(wù)。高并發(fā)后端應(yīng)用處理大量并發(fā)請(qǐng)求。數(shù)據(jù)處理管道用 Channel 輕松構(gòu)建數(shù)據(jù)流處理管道實(shí)現(xiàn)并行數(shù)據(jù)處理。批處理任務(wù)把大型任務(wù)分解為多個(gè) Goroutine 并行執(zhí)行加速處理速度。二、C20 CoroutineC20 標(biāo)準(zhǔn)引入的 Coroutine (協(xié)程) 和 Go 語(yǔ)言把并發(fā)作為一等公民的設(shè)計(jì)理念不同C Coroutine 秉承 C 一貫的“零成本抽象”提供的是一套低層級(jí)的語(yǔ)言機(jī)制而不是一個(gè)完整的并發(fā)解決方案。目標(biāo)是成為構(gòu)建高性能異步庫(kù)和框架的基礎(chǔ)。C Coroutine 的設(shè)計(jì)目標(biāo)是提供一種機(jī)制能編寫看起來(lái)像同步代碼的異步操作同時(shí)保持 C 固有的性能和控制力。Coroutine 機(jī)制本身不引入額外的運(yùn)行時(shí)開銷性能跟手動(dòng)編寫的狀態(tài)機(jī)相當(dāng)。編譯器負(fù)責(zé)把協(xié)程轉(zhuǎn)換為高效的代碼。C Coroutine 不是一個(gè)“開箱即用”的并發(fā)模型不包含內(nèi)置的調(diào)度器、I/O 庫(kù)或通信機(jī)制。相反只提供一套通用的語(yǔ)言特性在此基礎(chǔ)上構(gòu)建各種復(fù)雜的異步抽象。Coroutine 的主要受眾是庫(kù)和框架的作者可以用這一機(jī)制來(lái)創(chuàng)建更高效、更易用的異步 API。C Coroutine 的實(shí)現(xiàn)機(jī)制跟 Goroutine 有很大的不一樣編譯器轉(zhuǎn)換狀態(tài)機(jī)編譯器遇到一個(gè)標(biāo)記為協(xié)程的函數(shù)時(shí)也就是包含co_await,co_yield,co_return關(guān)鍵字的函數(shù)會(huì)把其轉(zhuǎn)換為一個(gè)狀態(tài)機(jī)。這個(gè)狀態(tài)機(jī)負(fù)責(zé)在協(xié)程暫停和恢復(fù)時(shí)保存和恢復(fù)其執(zhí)行上下文。無(wú)棧是 C Coroutine 跟 Goroutine 最明顯的區(qū)別之一。C Coroutine 是“無(wú)棧”的協(xié)程暫停時(shí)其調(diào)用棧會(huì)被完全展開局部變量和狀態(tài)不會(huì)保存在傳統(tǒng)的調(diào)用棧上。相反協(xié)程的狀態(tài)包括局部變量、參數(shù)和返回地址會(huì)被編譯器打包到一個(gè)稱為“協(xié)程幀”Coroutine Frame的結(jié)構(gòu)這個(gè)結(jié)構(gòu)是在堆上分配的。這種設(shè)計(jì)避免傳統(tǒng)線程上下文切換時(shí)棧的復(fù)制或切換開銷讓協(xié)程切換極其輕量。無(wú)內(nèi)置調(diào)度器C 標(biāo)準(zhǔn)庫(kù)只定義協(xié)程的語(yǔ)法和底層機(jī)制沒有提供任何形式的調(diào)度器。協(xié)程的暫停和恢復(fù)由co_await表達(dá)式?jīng)Q定但何時(shí)以及如何在哪個(gè)線程上恢復(fù)協(xié)程的執(zhí)行完全取決用戶或庫(kù)提供的執(zhí)行器。C Coroutine 可以跟任何事件循環(huán)、線程池或 I/O 框架直接集成。核心關(guān)鍵字co_await,co_yield,co_returnco_await暫停當(dāng)前協(xié)程的執(zhí)行等待一個(gè)“可等待對(duì)象”完成并在可等待對(duì)象完成后恢復(fù)執(zhí)行。co_yield生成一個(gè)值并暫停協(xié)程使其成為一個(gè)生成器。co_return從協(xié)程返回一個(gè)值或表示協(xié)程的完成。C Coroutine 的靈活性和可擴(kuò)展性得益于其底層的Promise 類型和 Awaitable 概念。每個(gè)協(xié)程都跟一個(gè) Promise 類型關(guān)聯(lián)該類型定義協(xié)程的返回值類型、異常處理方式以及協(xié)程的生命周期管理。Awaitable 對(duì)象定義await_ready、await_suspend和await_resume三個(gè)方法控制協(xié)程何時(shí)暫停、如何暫停以及如何恢復(fù)。所以任何人都可以高度定制協(xié)程的行為。C Coroutine 的優(yōu)勢(shì)因?yàn)闊o(wú)棧特性和編譯器優(yōu)化的狀態(tài)機(jī)C Coroutine 的上下文切換開銷理論上可以接近零遠(yuǎn)低于操作系統(tǒng)線程切換甚至低于 Goroutine 的運(yùn)行時(shí)調(diào)度開銷。讓 C Coroutine 在對(duì)延遲和吞吐量有極高要求的場(chǎng)景下表現(xiàn)卓越。可以完全控制協(xié)程的生命周期、內(nèi)存分配協(xié)程幀的分配位置、以及調(diào)度策略。這種底層控制能力是 C 語(yǔ)言的精髓讓使得異步代碼能以線性的、同步風(fēng)格的方式書寫徹底告別異步編程常見的“回調(diào)地獄”問題。結(jié)合 Promise 類型和 Awaitable 概念C Coroutine 能構(gòu)建出非常復(fù)雜、高效的異步流程、事件驅(qū)動(dòng)架構(gòu)和狀態(tài)機(jī)。C Coroutine 的缺點(diǎn)學(xué)習(xí)曲線陡峭相比 Goroutine 的簡(jiǎn)潔語(yǔ)法C Coroutine 的概念Promise 類型、Awaitable、協(xié)程幀、執(zhí)行器集成等相對(duì)復(fù)雜要開發(fā)者對(duì) C 語(yǔ)言特性和異步編程有更深入的理解學(xué)習(xí)門檻較高。C 標(biāo)準(zhǔn)庫(kù)不提供開箱即用的調(diào)度器和異步 I/O 庫(kù)。要依賴第三方庫(kù)或自行實(shí)現(xiàn)來(lái)管理協(xié)程的調(diào)度和集成異步 I/O 操作。雖然很多優(yōu)秀的庫(kù)和框架正在積極采用 C Coroutine但生態(tài)系統(tǒng)相比 Goroutine 而言還處在發(fā)展初期缺乏統(tǒng)一的、被廣泛接受的解決方案有一定程度的碎片化。C Coroutine 的應(yīng)用場(chǎng)景高性能網(wǎng)絡(luò)庫(kù)構(gòu)建高效的異步網(wǎng)絡(luò)服務(wù)器、客戶端和代理。游戲引擎實(shí)現(xiàn)復(fù)雜的動(dòng)畫序列、AI 行為和游戲邏輯提高幀率和響應(yīng)性。實(shí)時(shí)系統(tǒng)對(duì)時(shí)間敏感的系統(tǒng)用其低延遲特性處理并發(fā)事件。異步 I/O 框架作為底層構(gòu)建塊為文件操作、數(shù)據(jù)庫(kù)訪問提供高效的異步接口。事件驅(qū)動(dòng)架構(gòu)簡(jiǎn)化復(fù)雜事件處理流程的編寫。三、Coroutine 媲美Goroutine不同層級(jí)的抽象構(gòu)建塊 vs. 完整解決方案。這是兩者最根本的區(qū)別Goroutine完整的并發(fā)解決方案。Goroutine 是 Go 語(yǔ)言運(yùn)行時(shí)的一部分提供一套從創(chuàng)建、調(diào)度到通信的完整、開箱即用的并發(fā)模型。只要用go關(guān)鍵字Go 運(yùn)行時(shí)就會(huì)自動(dòng)管理 Goroutine 的生命周期、調(diào)度和跟操作系統(tǒng)線程的映射。是一個(gè)高層級(jí)的抽象把并發(fā)的復(fù)雜性封裝在語(yǔ)言和運(yùn)行時(shí)內(nèi)部。C Coroutine低層級(jí)的語(yǔ)言構(gòu)建塊。C Coroutine 不是一個(gè)完整的并發(fā)模型而是 C 語(yǔ)言提供的一組底層機(jī)制co_await,co_yield,co_return、Promise 類型和 Awaitable 概念。不包含內(nèi)置的調(diào)度器或 I/O 庫(kù)。C Coroutine 的目標(biāo)是作為構(gòu)建高性能異步庫(kù)和框架的基石要在其之上構(gòu)建自己的調(diào)度器、任務(wù)抽象和異步 I/O 接口。是一個(gè)低層級(jí)的抽象把控制權(quán)最大化交給開發(fā)者。所以如果是提供一個(gè)同樣簡(jiǎn)單易用、開箱即用的并發(fā)模型那么 C Coroutine 本身無(wú)法直接跟 Goroutine 媲美因?yàn)橐~外的庫(kù)支持。但如果指的是作為構(gòu)建高性能異步系統(tǒng)的底層能力那么 C Coroutine 有很大的潛力。性能方面各有側(cè)重。C Coroutine 的優(yōu)勢(shì)極致性能和精細(xì)控制。C Coroutine 的無(wú)棧特性和編譯器生成的狀態(tài)機(jī)上下文切換開銷理論上可以做到極低接近函數(shù)調(diào)用遠(yuǎn)低操作系統(tǒng)線程切換。因?yàn)闆]有內(nèi)置調(diào)度器C Coroutine 避免 Go 運(yùn)行時(shí)調(diào)度器帶來(lái)的固定開銷。甚至可以完全避免調(diào)度器直接在事件循環(huán)恢復(fù)協(xié)程。協(xié)程幀的分配可以由用戶控制甚至可以實(shí)現(xiàn)無(wú)堆分配的協(xié)程。適用場(chǎng)景對(duì)延遲、吞吐量和資源利用率有極致要求的場(chǎng)景如高頻交易系統(tǒng)、游戲引擎、實(shí)時(shí)嵌入式系統(tǒng)、高性能網(wǎng)絡(luò)庫(kù)等C Coroutine 能有非常大的優(yōu)化空間。Goroutine 的優(yōu)勢(shì)整體效率和易用性。高效的 M:N 調(diào)度Go 運(yùn)行時(shí)調(diào)度器在大多數(shù)通用場(chǎng)景下表現(xiàn)都非常出色能把大量 Goroutine 映射到少量 OS 線程充分利用多核 CPU。內(nèi)置 I/O 多路復(fù)用Go 運(yùn)行時(shí)集成了網(wǎng)絡(luò) I/O 的多路復(fù)用讓 Goroutine 在等待 I/O 時(shí)能自動(dòng)切換不用手動(dòng)管理。絕大多數(shù)高并發(fā)應(yīng)用而言Goroutine 提供的性能已經(jīng)綽綽有余并且在開發(fā)效率的加持下綜合效益更高。從絕對(duì)的理論性能和底層控制力來(lái)看C Coroutine 有超越 Goroutine 。但在大多數(shù)實(shí)際應(yīng)用Goroutine 提供的“足夠好”的性能和極高的開發(fā)效率相結(jié)合整體效率上更有競(jìng)爭(zhēng)力。開發(fā)體驗(yàn)和效率方面兩者差異就非常明顯了Goroutine 學(xué)習(xí)曲線平緩、開箱即用、快速迭代。C Coroutine 學(xué)習(xí)曲線陡峭。概念復(fù)雜、要手動(dòng)集成、初期開發(fā)效率低。但是只要 C Coroutine 的上層庫(kù)std::expected和std::generator成熟使用體驗(yàn)就變得非常簡(jiǎn)潔。屆時(shí)C Coroutine 在使用層面的易用性就能跟 Goroutine 媲美甚至更勝一籌。生態(tài)系統(tǒng)和標(biāo)準(zhǔn)化Goroutine統(tǒng)一、成熟的生態(tài)。Goroutine 是 Go 語(yǔ)言的核心特性都用相同的并發(fā)模型。而且 Go 標(biāo)準(zhǔn)庫(kù)的各個(gè)模塊都原生支持 Goroutine 和 Channel形成一個(gè)統(tǒng)一、強(qiáng)大的生態(tài)系統(tǒng)。圍繞 Goroutine 和 Channel 形成一套清晰的并發(fā)編程范式社區(qū)資源豐富。C Coroutine發(fā)展中、碎片化。缺乏標(biāo)準(zhǔn)化調(diào)度器/I/O 庫(kù)生態(tài)碎片化風(fēng)險(xiǎn)。很多優(yōu)秀的 C 庫(kù)正在積極整合 C Coroutine未來(lái)會(huì)有在標(biāo)準(zhǔn)上出現(xiàn)。C Coroutine 在技術(shù)能力和潛力上足以媲美甚至超越 Goroutine尤其是要極致性能和底層控制的領(lǐng)域。但是在易用性和開箱即用性上Goroutine 還是有主導(dǎo)優(yōu)勢(shì)。提供完整的、容易學(xué)習(xí)和使用的并發(fā)模型能快速構(gòu)建高并發(fā)應(yīng)用。Goroutine適合追求開發(fā)效率、快速迭代、以及在通用高并發(fā)場(chǎng)景下獲得“足夠好”性能的開發(fā)者。C Coroutine適合追求極致性能、精細(xì)控制、以及作為庫(kù)和框架作者構(gòu)建高性能異步基礎(chǔ)設(shè)施的開發(fā)者。四、Coroutine 的影響力Goroutine 的影響力不只是技術(shù)上的先進(jìn)更在對(duì) Go 語(yǔ)言生態(tài)、開發(fā)者社區(qū)乃至整個(gè)行業(yè)產(chǎn)生的深遠(yuǎn)影響定義 Go 語(yǔ)言的并發(fā)范式降低并發(fā)編程的門檻引發(fā)廣泛的范式轉(zhuǎn)變。以此為標(biāo)準(zhǔn)審視 C Coroutine 的潛力。Goroutine 的影響力Goroutine 幾乎是 Go 語(yǔ)言的代名詞。和 Channel 結(jié)合共同構(gòu)成了 Go 語(yǔ)言獨(dú)有的、簡(jiǎn)潔而強(qiáng)大的并發(fā)模型。任何學(xué)習(xí) Go 語(yǔ)言的開發(fā)者都會(huì)首先接觸并掌握 Goroutine。go func()的簡(jiǎn)單語(yǔ)法結(jié)合 Go 運(yùn)行時(shí)自動(dòng)調(diào)度和 Channel 的安全通信機(jī)制大量非專業(yè)的并發(fā)編程開發(fā)者也能編寫出高效、正確的并發(fā)代碼。Goroutine 構(gòu)建高并發(fā)、高伸縮性的網(wǎng)絡(luò)服務(wù)非常簡(jiǎn)單這跟微服務(wù)和云原生架構(gòu)的需求高度契合從而在很大程度上推動(dòng)這些技術(shù)棧的普及。Goroutine 的成功讓更多語(yǔ)言和開發(fā)者看到輕量級(jí)協(xié)程的巨大潛力加速其他語(yǔ)言對(duì)類似機(jī)制的采納和發(fā)展。雖然 C Coroutine 在技術(shù)有強(qiáng)大的潛力但要帶來(lái) Goroutine 那樣的廣泛影響力還不夠C 是構(gòu)建塊,不是完整解決方案。C 語(yǔ)言只是提供低層級(jí)的、零成本的抽象在此基礎(chǔ)上構(gòu)建自己的解決方案。Coroutine 它本身不是一個(gè)完整的、開箱即用的并發(fā)模型。不提供標(biāo)準(zhǔn)化的調(diào)度器、異步 I/O 庫(kù)或通信機(jī)制。要達(dá)到 Goroutine 那樣的易用性C 要在 Coroutine 之上構(gòu)建一個(gè)或多個(gè)事實(shí)上的標(biāo)準(zhǔn)庫(kù)/框架而這要時(shí)間且不保證能形成統(tǒng)一。相比go func()的簡(jiǎn)潔直觀C Coroutine 涉及的概念Promise 類型、Awaitable、協(xié)程幀、執(zhí)行器集成、生命周期管理等更為復(fù)雜和底層。掌握這些概念并要投入相當(dāng)大的學(xué)習(xí)成本。生態(tài)系統(tǒng)碎片化。標(biāo)準(zhǔn)庫(kù)沒有提供統(tǒng)一的調(diào)度器和異步 I/O 庫(kù)C Coroutine 的使用依賴各種第三方庫(kù)。生態(tài)系統(tǒng)碎片化跨項(xiàng)目和跨庫(kù)的協(xié)作不如 Go 那樣統(tǒng)一和簡(jiǎn)單。C 已經(jīng)有std::thread、std::future、std::async以及各種鎖和原子操作等成熟的并發(fā)工具。Coroutines 是對(duì)現(xiàn)有工具的補(bǔ)充和增強(qiáng)尤其是在異步 I/O 方面而不是一個(gè)顛覆性的替代品。它更多地是解決特定領(lǐng)域的痛點(diǎn)而不是改變整個(gè) C 的并發(fā)編程范式。雖然很難復(fù)制 Goroutine 的影響力模式C Coroutine 還是對(duì) C 社區(qū)和相關(guān)行業(yè)產(chǎn)生深遠(yuǎn)、獨(dú)特的影響提升 C 在異步編程領(lǐng)域的競(jìng)爭(zhēng)力Coroutine 改善 C 編寫高性能、高可讀性異步代碼方面的能力。C 在網(wǎng)絡(luò)服務(wù)、游戲引擎、實(shí)時(shí)系統(tǒng)、高性能計(jì)算等對(duì)性能和響應(yīng)性有極致要求的領(lǐng)域能夠更好應(yīng)對(duì)現(xiàn)代異步編程的挑戰(zhàn)保持領(lǐng)先地位。Coroutine 能把復(fù)雜的異步流程以同步代碼的風(fēng)格表達(dá)徹底告別 C 長(zhǎng)期存在的“回調(diào)地獄”問題。Coroutine 為庫(kù)和框架的作者提供強(qiáng)大的底層工具構(gòu)建更高效、更易用的異步抽象。未來(lái)會(huì)看到更多基于 Coroutine 的高性能網(wǎng)絡(luò)庫(kù)、任務(wù)調(diào)度框架和異步 I/O 庫(kù)涌現(xiàn)這些庫(kù)將間接提升整個(gè) C 生態(tài)的異步編程水平。推動(dòng) C 現(xiàn)代化進(jìn)程。結(jié)論影響力不同但同樣重要。C20 Coroutine 不太可能像 Golang 的 Goroutine 那樣用一種統(tǒng)一、簡(jiǎn)單的方式徹底改變 C 語(yǔ)言的并發(fā)編程范式并帶來(lái)同等規(guī)模的、對(duì)整個(gè)行業(yè)產(chǎn)生廣泛影響力的范式轉(zhuǎn)變。它的影響力更多體現(xiàn)在提升 C 在特定高性能異步領(lǐng)域的競(jìng)爭(zhēng)力改善現(xiàn)有復(fù)雜異步代碼的維護(hù)性上。五、結(jié)語(yǔ)Golang 的 Goroutine開箱即用的特性、極簡(jiǎn)的語(yǔ)法和內(nèi)置的運(yùn)行時(shí)調(diào)度器成功把并發(fā)編程的門檻降至前所未有的低點(diǎn)。C20 Coroutine提供的是一套低層級(jí)的、極致靈活的語(yǔ)言構(gòu)建塊。不包含內(nèi)置的調(diào)度器或 I/O 庫(kù)而是把這些職責(zé)交由庫(kù)作者和開發(fā)者自行實(shí)現(xiàn)。關(guān)于 C Coroutine 能否跟 Goroutine 媲美以及能否帶來(lái)同等影響力的問題結(jié)論是在技術(shù)能力和潛力上C Coroutine 足以媲美甚至超越 Goroutine。特別是極致性能和底層控制的領(lǐng)域C 在異步編程領(lǐng)域有跟 Go 語(yǔ)言一較高下的底層能力。但是C Coroutine 不太可能帶來(lái) Goroutine 那樣廣泛的、對(duì)整個(gè)行業(yè)產(chǎn)生范式轉(zhuǎn)變的影響力。隨著 C Coroutine 生態(tài)系統(tǒng)的逐漸成熟特別是標(biāo)準(zhǔn)化或事實(shí)上的標(biāo)準(zhǔn)執(zhí)行器和異步 I/O 庫(kù)出現(xiàn)C Coroutine 的易用性會(huì)大大提升。屆時(shí)C 開發(fā)者能以更簡(jiǎn)潔、高效的方式利用這一強(qiáng)大特性。