亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Go 通道加速 for 循環

使用 Go 通道加速 for 循環

Go
回首憶惘然 2022-01-17 16:31:28
我正在嘗試使用 Go 的并發性來加速我的代碼,這是我所擁有的:            for i:=7; i>-1; i-- {                go func (ch chan int32, ch2 chan int32, i int, arx int32, ary int32, dirf []int8, dirg []int8) {                    nx := arx + int32(dirf[i])                    ny := ary + int32(dirg[i])                    ch <- nx                    ch2 <- ny                }(ch, ch2, i, arx,ary,dirf,dirg)            }            for i:=7; i>-1; i-- {                nxx := <- ch                nyx := <- ch2                ind := nyx*w+nxx                if imData[ind] == e[i]{                    process[c]=nxx                    process[c+1]=nyx                    c+=2                    matrix[ind]=1                }            }運行此之后,我沒有得到我期望的矩陣切片,它充滿了零。但是如果我運行下面的代碼,它會給出矩陣切片,就像沒有通道的代碼一樣,但它太慢了。            for i:=7; i>-1; i-- {                go func (ch chan int32, ch2 chan int32, i int, arx int32, ary int32, dirf []int8, dirg []int8) {                    nx := arx + int32(dirf[i])                    ny := ary + int32(dirg[i])                    ch <- nx                    ch2 <- ny                }(ch, ch2, i, arx,ary,dirf,dirg)                nxx := <- ch                nyx := <- ch2                ind := nyx*w+nxx                if imData[ind] == e[i]{                    process[c]=nxx                    process[c+1]=nyx                    c+=2                    matrix[ind]=1                }            }第一個有什么問題?有任何想法嗎?我對 Go 很陌生。所以,當你提出一些建議時,請清楚。
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

在第二種情況下,您確定 goroutines 是“以正確的順序”執行的,因為您在繼續執行下一個之前等待 goroutines 完成。

golang 操場上的這個最小示例就是一個例子。要解決此問題,您可能希望通過通道傳遞三個成員的結構,即 your和nxvalues 。nyi


查看完整回答
反對 回復 2022-01-17
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

我懷疑您的“if imData[ind] == e[i]”條件在前一種情況下失敗了,但是如果沒有通道的設置代碼以及有關這些不同切片的更多詳細信息,就很難判斷。您是否嘗試過使用 print 語句運行它以查看您從渠道中獲得了什么?

另外,請注意,如果有問題的通道被緩沖,則不能保證ch和中的值ch2將以相同的順序排列。這很可能是你的問題。

Goroutine 1 可以給 on 賦值ch,但是 Goroutine 2 可以ch2在 Goroutine 1 到達之前給 on 賦值。如果您有 7 個 goroutine,則完全有可能在通道(或任意數量的其他通道)上看到以下順序:

ch: 1, 2, 3, 4, 5, 6, 7

ch2: 1, 3, 4, 5, 6, 7, 2

如果它們沒有被緩沖,那么這對你的代碼來說是不可能的,但它在技術上仍然是不安全的(編輯:實際上,它仍然不會與i第二個循環匹配)。如果數據是一組有序對,您應該通過單個通道將每對作為結構發送。

順便說一句,您只需要將變量傳遞給go func()調用,如果它們預計會在調用之外發生變化。 chch2arxarydirf, 和dirg所有這些對于這段代碼來說似乎都是有效的常量,因此不需要傳遞給go func(). 您只需要傳入i,因為循環在將外殼觸發到 goroutine 后立即更改它。

現在,從純粹的速度角度來看,您最好將第一個循環移動到go func()調用中。您可以在主例程中循環時創建 7 個 goroutine,而不是創建一個例程,它會循環遍歷這些值并將它們發送到通道上。如果通道被緩沖到至少那個大小,這將成為一個非??焖俚牟僮?。順便說一句,這也解決了通道排序的問題(盡管在單個通道上將有序對作為結構發送仍然更好),因為您只有一個 goroutine 試圖在通道上發送。


查看完整回答
反對 回復 2022-01-17
  • 2 回答
  • 0 關注
  • 298 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號