Go語言使用goroutine來發起併行/併發程序。
Go的goroutine為Go runtime所管理的輕量執行緒,類似Java的thread。
使用go
關鍵字及後接要執行的函式名稱即可。例如下面的go count(...)
。
count()
函式的迴圈每執行一次會呼叫time.Sleep()
暫停調用的goroutine一秒。
package main
import (
"fmt"
"time"
)
func count(n int, s string) {
for i := 0; i < n; i++ {
fmt.Printf("%s:%d\n", s, i)
time.Sleep(time.Second * 1) // stop current goroutine 1 second
}
}
func main() {
go count(5, "goroutine") // start a goroutine invoke count()
count(5, "main") // current goroutine (main) invoke count()
}
上面範例中主程式main(主程式本身也是一個goroutine)發起了一個新的goroutine來呼叫count()
函式,然後自己也呼叫count()
,由於是併行處理所以印出結果可能如下。
main:0
goroutine:0
goroutine:1
main:1
main:2
goroutine:2
goroutine:3
main:3
main:4
goroutine:4
goroutine是並行程序所以不保證順序,也就是說有多個goroutine在執行則彼此執行的順序是由系統決定。當多個goroutine存取共用變數時通常需要利用sync.Mutex
互斥鎖避免多個goroutine交錯存取導致非預期的結果。
沒有留言:
張貼留言