網頁

2021/7/6

Golang 使用goroutine並行程序 concurrent program

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交錯存取導致非預期的結果。


沒有留言:

張貼留言