go --goroutine

①: 一个类似于"支线任务"的独立函数或方法, 可开多个, 各个"支线任务"内使用channel(管道)进行通信, 传输数据

②: 并发 (左脚, 右脚, 左脚, 右脚). 并行(双脚, 双脚)

-- 创建 协程

package main 
import (
"fmt"
"time"
) func readygo() { fmt.Println("left") } func main() { go readyGo() //开启协程 使用关键字go time.Sleep(1) //暂停1秒 让协程有时间返回数据 fmt.Println("right") }

-- 创建多个协程

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")
}

-- 进程 调度 runtime

runtime.Gosched(), 出让CPU时间片, 让出当前goroutine执行权限. 按排其它任务等待的任务执行, 在下次执行时间点时再恢复

runtime.Goexit(), 终止该goroutine, 终止前有defer语句则执行完该语句

runtime.GOMAXPROCS() 设置CPU 核心数

-- 协程中出让时间片

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)
    }
}

猜你喜欢

转载自www.cnblogs.com/cheesemp/p/10558158.html