go語言中goroute使用 遇到的坑

2022-04-06 06:14:30 字數 2518 閱讀 6982

先看下源**,預想從1至n總取出所有能被a或b整除的正整數之和,為了利用go語言的並行優勢,特使用goroute特性來實現,同時使用普通順序計算進行效率比較分析

package chango

import (

"fmt"

"time"

)func get_sum_of_divisible(num int64, divider int64, resultchan chan int64)

}resultchan <- sum

}func zhengchu_testing(limit int64, one int64, two int64)

if value%two == 0

if value%three == 0

}fmt.println(sum)

t_end = time.now()

fmt.printf("testing times2:%v\n", t_end.sub(t_start))

}然後在main包中呼叫該chango包

package main

import "./chango"

func main()

初看上去,chango包沒有語法毛病,但是實際測試發現,顯然通過順序計算10以內能被3或5整除的所有正整數分別為3,5,6,9,他們之和應該為23,能被3整數的整數之和為3+6+9=18,能被5整除的正整數之和為5,能被3*15=15的正整數之和為0

而通過goroute計算10以內能被3或5整除的所有正整數之和卻不是23,而是-13或13,這又是為什麼呢?

通過除錯發現,問題就出現在「:=」語句中

one_sum, two_sum, three_sum := <-resultchan, <-resultchan, <-resultchan

多次執行
通過分別列印能被3或5或3*5=15的正整數之和,他們的結果竟然是0,18,5或0,5,18,這個結果竟然不唯一

既然是這個語句有問題,此路不通,暫時繞道行之

於是修改源**如下:

package chango

import (

"fmt"

"time"

)func get_sum_of_divisible(num int64, divider int64, resultchan chan int64)

}resultchan <- sum

}func zhenchu_testing(limit int64, one int64, two int64)

var ch [3](chan int64)

for i := 0; i < 3; i++

t_start := time.now()

for i:=0;i<3;i++

one_sum:=<-ch[0]

two_sum:=<-ch[1]

three_sum:=<-ch[2]

var sum int64

var value int64

sum = one_sum + two_sum - three_sum

fmt.println(sum)

t_end := time.now()

fmt.println(one_sum, two_sum, three_sum)

fmt.printf("testing times1:%v\n", t_end.sub(t_start))

sum = 0

t_start = time.now()

for value = 1; value < limit; value++

if value%two == 0

if value%three == 0

}fmt.println(sum)

t_end = time.now()

fmt.printf("testing times2:%v\n", t_end.sub(t_start))

}這下在main包中呼叫該chango包通過!

結下來分析goroute同普通順序計算進行效率比較分析,開始當計算從1至n總取出所有能被a或b整除的正整數之和中n的n的數值比較小的情況下,goroute的並行出來優勢沒有發揮出來,

測試列印輸出如下:

當n=20

78 

63 30 15

testing times1:33.557µs

78testing times2:2.382µs

當n的數值很大的情況下,如100000000,goroute的平行計算優勢就發揮出來了!
測試列印輸出如下:

2333333316666668

1666666683333333 999999950000000 333333316666665

testing times1:1.574445477s

2333333316666668

testing times2:2.199982414s

go語言之goroute協程

goroute協程 程序和執行緒 程序是系統進行資源分配和排程的基本單位,執行緒是cpu排程和發派的基本單位,乙個程序可以建立和撤銷多個執行緒 併發和並行 多執行緒程式在乙個核的cpu上面執行,是併發 多執行緒程式在多個核的cpu上面執行,這是並行 協程和執行緒 協程 獨立的棧空間,共享的堆記憶體,...

Go語言中使用JSON

encode 將乙個物件編碼成json資料,接受乙個inte ce 物件,返回byte和error func marshal v inte ce byte,error marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下 bool型別 轉換為json的boole...

Go語言中defer的使用

func print a int func add a,b int int fmt.println add 4,3 上面這段 defer語句輸出的是4,add返回的值是7。defer可以用於檔案的開啟和關閉,鎖的開啟和關閉。package ioutil func readfile filename ...