我只是最近才了解Google的編程語言Go。它為并發(fā)提供了支持,對(duì)此我很感興趣,并且開始學(xué)習(xí)更多有關(guān)它的知識(shí)。但是,我去看看Go是如何實(shí)現(xiàn)并發(fā)的特定功能的,到目前為止,我還沒有任何證據(jù)表明該功能確實(shí)存在。這是一個(gè)假設(shè)的情況:假設(shè)我們正在編寫一個(gè)函數(shù)來確定特定輸入的Foo值。對(duì)于任何給定的輸入,在域A或域B中都不能找到Foo值(兩者都不存在)。這些域中的搜索技術(shù)有很大不同,但是它們共享的屬性是成功的搜索往往會(huì)很快返回,而不成功的搜索則必須遍歷整個(gè)數(shù)據(jù)集才能詳盡無遺,因此需要很長時(shí)間?,F(xiàn)在,在使用并發(fā)的其他語言(例如Cilk)中,可以對(duì)Foosearch函數(shù)進(jìn)行編程,以便產(chǎn)生Asearch函數(shù)和Bsearch函數(shù)。這些函數(shù)將同時(shí)運(yùn)行,并且每當(dāng)它們中的任何一個(gè)給出答案時(shí),該答案都將被報(bào)告給調(diào)用函數(shù)Foosearch,該函數(shù)將終止所產(chǎn)生的所有未返回的函數(shù)。但是,使用Go的goroutine,您似乎只能將兩個(gè)例程與一個(gè)通道連接-因此,您無法設(shè)置Asearch或Bsearch可以向其發(fā)送的通道,具體取決于哪個(gè)首先找到答案,并讓Foosearch從中讀取它??雌饋砟矡o法從某個(gè)通道讀取而不阻止它-因此您無法讓Foosearch啟動(dòng)Asearch和Bsearch并從這兩個(gè)通道建立通道,然后循環(huán)運(yùn)行以查看是否產(chǎn)生了另一個(gè)通道答案。我對(duì)Go并發(fā)限制的理解正確嗎?還有另一種方法可以達(dá)到給定的結(jié)果嗎?
2 回答

慕的地10843
TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以使用select關(guān)鍵字從多個(gè)渠道接收。
該值將從具有比其他結(jié)果更早的結(jié)果的通道中獲取。
var c1, c2 chan int;
var result int;
select {
case result = <-c1:
print("received ", result, " from c1\n");
case result = <-c2:
print("received ", result, " from c2\n");
}
- 2 回答
- 0 關(guān)注
- 272 瀏覽
添加回答
舉報(bào)
0/150
提交
取消