go --goroutine

①: 一個相似於"支線任務"的獨立函數或方法, 可開多個, 各個"支線任務"內使用channel(管道)進行通訊, 傳輸數據併發

②: 併發 (左腳, 右腳, 左腳, 右腳). 並行(雙腳, 雙腳)函數

-- 建立 協程oop

package main 
import (
"fmt"
"time"
) func readygo() { fmt.Println("left") } func main() { go readyGo() //開啓協程 使用關鍵字go time.Sleep(1) //暫停1秒 讓協程有時間返回數據 fmt.Println("right") }

-- 建立多個協程
spa

package main

import (
    "fmt"
    "time"
)
func num() { //每1秒輸出一個數字 1 2 3 4 5
    for i := 1; i <= 5; i++ {
        time.Sleep(1000 * time.Millisecond)
        fmt.Printf("1s: %d\n", i)
    }
}
func abc() { //每1.5秒輸出一個字母 a b c d e
    for i := 'a'; i <= 'e'; i++ {
        time.Sleep(1500 * time.Millisecond)
        fmt.Printf("1.5s: %c\n", i)
    }
}
func main() {
    go num()
    go abc()
    time.Sleep(10000 * time.Millisecond) //觀察num的3秒-4秒和abc的3秒-4.5秒
    fmt.Println("main terminated")
}

-- 進程 調度 runtimecode

runtime.Gosched(), 出讓CPU時間片, 讓出當前goroutine執行權限. 按排其它任務等待的任務執行, 在下次執行時間點時再恢復協程

runtime.Goexit(), 終止該goroutine, 終止前有defer語句則執行完該語句blog

runtime.GOMAXPROCS() 設置CPU 核心數進程

-- 協程中出讓時間片
it

package main
import (
    "fmt"
    "runtime"
)
func loop() {
    for i := 0; i < 3; i++ {
        if i == 1 {
            runtime.Gosched()       //讓出時間片
            fmt.Printf("i'm out\n") //(3)
             // runtime.Goexit()  //退出當前協程
        }
        fmt.Printf("%d\n", i) //(1) (4)(5)
    }
}
func main() {
    go loop() //開啓協程
    for i := 0; i < 2; i++ {
        runtime.Gosched()      //讓出時間片,先讓別的協程loop()執行
        fmt.Println("let' go") //(2) (6)
    }
}
相關文章
相關標籤/搜索