detalles de la rutina

contenido

1. Crea una rutina go

1. Inicie una sola rutina

2. El problema de usar goroutine

3. Inicie múltiples gorutinas

2. Usa funciones anónimas para crear goroutines


1. Crea una rutina go

        Un programa Go usa la palabra clave go para crear una rutina go para una función. Una función puede ser creada por múltiples gorutinas, y una gorutina debe corresponder a una función.

go 函数名( 参数列表 )

        Cuando se crea una goroutine con la palabra clave go, se ignora el valor de retorno de la función llamada. Si necesita devolver datos en la gorutina, debe usar la función de canal (channel) y pasar los datos fuera de la gorutina como el valor de retorno a través del canal.

1. Inicie una sola rutina

func running() {
    fmt.Println("Hello Goroutine!")
}

func main() {
    go running() // 启动另外一个goroutine去执行hello函数
    fmt.Println("main goroutine done!")
}

        Cuando se inicia el programa, el tiempo de ejecución (runtime) creará una gorutina para la función main() de forma predeterminada. Cuando la instrucción go running se ejecuta en la gorutina de la función main(), se crea la gorutina que pertenece a la función running() y la función running() comienza a ejecutarse en su propia gorutina. En este punto, main() continúa ejecutándose y las dos goroutines operan simultáneamente a través del mecanismo de programación del programa Go.

 

2. El problema de usar goroutine

El resultado de la ejecución esta vez solo imprime goroutine principal hecho!, y no imprime Hello Goroutine!. ¿por qué?

1) Cuando se inicia el programa, el programa Go crea una gorutina predeterminada (corrutina principal) para la función main().

2) Cuando la función main() regresa, la gorutina finaliza y todas las gorutinas iniciadas en la función main() terminarán juntas

Así que tenemos que encontrar una manera de hacer la rutina principal y otras rutinas, la forma más simple y cruda es el tiempo. Dormir.

func main() {
    go hello() // 启动另外一个goroutine去执行hello函数
    fmt.Println("main goroutine done!")
    
    time.Sleep(time.Second) //停顿一秒,这种方法不好,见channel阻塞/死锁详解
}

3. Inicie múltiples gorutinas

var wg sync.WaitGroup

func hello(i int) {
    defer wg.Done() // goroutine结束就登记-1
    fmt.Println("Hello Goroutine!", i)
}
func main() {

    for i := 0; i < 10; i++ {
        wg.Add(1) // 启动一个goroutine就登记+1
        go hello(i)
    }
    
    wg.Wait() // 等待所有登记的goroutine都结束
}

Ejecute el código anterior varias veces y encontrará que el orden de los números impresos cada vez es inconsistente. Esto se debe a que las 10 gorrutinas se ejecutan simultáneamente y la programación de las gorrutinas es aleatoria.

2. Usa funciones anónimas para crear goroutines

Goroutines también se puede iniciar para funciones anónimas o cierres después de la palabra clave go.

go func( 参数列表 ){
    函数体
}( 调用参数列表 )

Cree una función anónima en la función main() e inicie una rutina para la función anónima. Las funciones anónimas no tienen parámetros.

package main
import (
    "fmt"
    "time"
)

func main() {
    go func() {
        var times int
        for {
            times++
            fmt.Println("tick", times)
            time.Sleep(time.Second)
        }
    }()
    
    var input string
    fmt.Scanln(&input)
}

Resumir:

1) Todas las gorutinas terminarán juntas cuando finalice la función main()

2) Aunque goroutine es similar al concepto de subprocesos, no es tan detallado en términos de rendimiento de programación, y el grado de detalle depende de la implementación y el entorno operativo del programador goroutine del programa Go.

Supongo que te gusta

Origin blog.csdn.net/demored/article/details/124116021
Recomendado
Clasificación