async await非同步模型是否優於stackful coroutine模型?

時間 2021-05-14 11:01:44

1樓:

dotnet的async/await有個問題是,它可並不保證非同步哦Go:package

main

import

("fmt"

"sync"

)func

hello(wg

*sync

.WaitGroup,i

int)

func

main

()fmt

.Println

("main")wg

.Wait()}

輸出main

hello 9

hello 1

hello 0

hello 4

hello 6

hello 7

hello 5

hello 8

hello 2

hello 3

dotnet:

using

System

;using

System.Collections.Generic;using

System.Threading.Tasks;public

class

Program

Console

.WriteLine

("main"

);Task

.WaitAll

(tasks

.ToArray

());

}private

static

async

Task

Hello

(inti)

");}}

輸出hello 0

hello 1

hello 2

hello 3

hello 4

hello 5

hello 6

hello 7

hello 8

hello 9

main

注意這裡的hello是絕對同步執行的,不是隨機的剛好按順序執行哦把await Task.Delay(0).ConfigureAwait(false);

改成await Task.Delay(1).ConfigureAwait(false);

或者await Task.Run(()=>{}).ConfigureAwait(false);

才是真非同步,輸出

main

hello 9

hello 6

hello 7

hello 8

hello 2

hello 1

hello 3

hello 5

hello 4

hello 0

2樓:毛鳴

[1,2,3].

forEach

(async(n

)=>);JS 中不能這樣寫,因為 Array.prototype.forEach 本身沒有考慮 async 函式。

你可以自己寫乙個支援 async 的 forEach,然而一般情況下這個 forEach 是別人寫的,當然生態發展好了的話這個不是問題。

Stackful coroutine 沒有這個問題。

至於這算不算 async/await 的缺點,還是說是乙個微不足道的小特性甚至優點,見仁見智吧……

3樓:陳厚來

async/await更優。

如果測試多工,兩個方案:

用nodejs的async/await或者promise實現用boost::coroutine或swapcontent實現測試併發任務數不用多,10k以上,你會發現nodejs居然比c/c++還快。

為什麼,c/c++時間耗費在coroutine的儲存/恢復暫存器上了。

4樓:豈丈夫

從複雜度管理的角度上,我覺得stackfull coroutine是要優於async/await

coroutine可以在底層庫就將非同步的複雜度近乎完全遮蔽掉,可以極大地減輕心智負擔。 這點是async/await比不了的。

關於coroutine, promise, async, await

5樓:ggffss

說實話就我使用下來感覺是,goroutine+chan+select 這種模式要優於 async/await

原因是因為前者完整地提供了一整套並行程式設計的方案(資料同步等)。更像乙個開放式的流水線。

而 async/await 這種還不足以與之相提並論。僅僅只是非同步 (一種暗箱,黑盒)。

另外從思維理解上來說,goroutine的方式也更加便於理解。而 async/await 其實是有點莫名其妙的。

這裡有一篇駁老趙的文章:為什麼goroutine和channel不是以類庫的形式存在--駁老趙《為什麼我認為goroutine和channel是把別的... - 推酷

更新:暗箱黑盒的描述其實不夠準確。其實我只想表達go語言的協程簡單寫起來簡單看起來也很簡單。簡單的就是好的。

我想表達的意思也就是這麼簡單不好意思真沒那麼複雜好麼 ╮(╯▽╰)╭。

6樓:蘇維

async/await和stackfull co不是同一層的概念,不能預設前者就是stackless co,c#的也不全然都是,也看到有其他答主提到了幾種工作在不同級別的async/await實現方式。

——不過不糾結了。

在流行語言中,分別只對比c#和go的對應實現來看的話,明顯前者寫著不會更費事,效能卻好的多,具體實現上的細節有其他答主闡明得很詳細了。

題主問這個問題顯然不接受否定的答案,他只是想看看多少人持有相同的看法吧。

7樓:

async / await 是用於流程控制,且只用於表達非同步流程,需要配合其他併發機制,才能發揮作用。coroutine 是併發機制,用於表達概念上同時進行的過程。兩個正交的概念,沒有優劣之分。

換句話說,沒有 coroutine 或者 OS 執行緒等設施,async / await 就沒用了。還有,在執行期,是沒有 async / await 這個概念的,只有 coroutine 或者 OS 執行緒,這是根本的不同。

不需要分配棧記憶體?那非同步的操作,是誰幫你做了?還不是其他併發單元!

Nodejs中的非同步到底是優勢還是劣勢?

zy445566 例子,比如實現curl功能,傳統來說就是等待請求返回的時候是CPU不斷的判斷是否請求返回。而nodejs來說既然請求始終是要一定的時間,那我就把你放到佇列裡面,等會再判斷是否返回。那麼等待返回的時間裡,傳統做法是讓CPU就不斷地死迴圈判斷是否請求返回 這時就阻塞了,浪費大量沒必要的...

高達模型 為什麼明明是盜版的模型還會炒成很貴的海景房?

ExShepherd 看了一下,都在說中國產優勢,我說個萬代的問題。萬代整體在進行調整,人員新老交替,磨合階段新模少於是就給其他人有了可乘之機。接下來人事磨合基本完成,市場掃清,看看今年的MG和RE,1 100要回來了。 10年前甚至20年前就有人做盜版的高達模型,但那時候盜版的模型質量很差,和B社...

什麼程式語言機制是處理非同步 IO 最恰當的抽象?

何志斌 目前看,最好的方式還是async和await。2017年7月1日修改 也許使用者態多執行緒 協程 這種方式更好。我需要一些時間去實驗一下Go Kotlin king wt 真夠 乎的,你寫的接觸的,天天看的 互動事件都是事件非同步驅動的,你天天用的 伺服器是事件非同步驅動的。如果程式不建立監...