ir programación corrutina

Este artículo no trata a través del canal, sincronización y otra redacción específica para lograr la programación corrutina, enviando simplemente hablar corrutina este niño.

programación no preferente

Corrutina lenguaje de programación Go es una programación no preferente, donde una no preferente? Digamos preventiva.

Sabemos que la programación de subprocesos sistema operativo, utilice el round-robin de la programación de cada tramo de hilo, cuando el tiempo necesario para reconstruir el hilo de la rosca A B, independientemente de en qué estado está el hilo Una primera será detenido. Esto a menudo la programación de una situación en la que un hilo está haciendo una cosa que hacer la mitad del tiempo, el tiempo para, con el fin de asegurar que el próximo segmento de tiempo que a su vez, sólo podemos seguir haciendo la cosa, hilo una necesidad de que el estado actual en el registro, entonces el problema será obvio, mantener un registro de esta operación es muy lento, esto es una preferencia deficiencias.

El movimiento no preferente de la misma, nadie se refiere a la fuerza detuvo a un co-rutina para realizar otra corrutina, corrutina tomará la iniciativa de renunciar a la CPU . Cómo hacer una ley? La naturaleza no es libre de hacer, de manera que cuando el propósito es evitar la necesidad de cambiar a una pila de Estado corrutina en el registro, por lo corrutina terminará una cosa a la hora de dejar la CPU, por lo que no es necesario guardar nada hasta .

programación en tiempo de compilación

Así que, ¿cómo saber cuándo terminar corrutina una cosa es? Si el tiempo de ejecución para determinar este niño, obviamente, requiere costes adicionales, por lo que el lenguaje go se determina en tiempo de compilación, lo que significa que cuando se ejecuta el programa, cómo cambiar entre corrutinas, en tiempo de compilación planificada una . Este es el nivel de idioma para lograr los beneficios van corrutina surjan.

punto de conexión

Aquí hay varias corrutina posible entrega de:

  • io, tales como impresión, acabado de impresión, el acabado puede ser considerado como una cosa
  • Las llamadas a funciones se pueden entender como a las funciones de llamada que tienen que hacer otra cosa que los niños, así que esta vez se puede cambiar
  • canal, sincronización, runtime.Gosched (), que siempre ha sido más que corrutina con algo, no dicen

Tenga en cuenta que lo anterior son varias, pero el interruptor no puede cambiar necesariamente, que no siempre es impresión acabada sin duda cambiar a otra marcha hilo, ir determinará un momento más apropiado para cambiar el código real.

En realidad, esto se puede ver un pequeño ejemplo, el código siguiente, se abrió el 10 corrutina, pero en realidad es 11, no hay que olvidar la co-rutina principal es una co-rutina , es muy importante, porque una vez que la co-rutina principal salida, otra corrutina también se mató, por lo que el siguiente programa, que permita que el sueño principal corrutina un segundo, si no duermen, no esperar a que la co-rutina principal intervalos de tiempo lo regalan, la co-rutina principal poner fin a ejecutar directamente de los 10 otros co-rutinas no debutará oportunidad.

package main

import (
	"fmt"
	"time"
)

func main()  {
	for i := 0; i < 10; i++ {
		go func(i int) {
			for {
				fmt.Println(i)
			}
		}(i)
	}
	time.Sleep(time.Second)
}

Los resultados de la ejecución del programa mucho, que sólo duran un corto de muestras, es suficiente para explicar el problema.

Después se puede ver, la interceptación de esto, hubo un cambio corrutina, se produjo el interruptor después de la impresión de 3 corrutina ha impreso más de 3, es decir, conmutación corrutina ocurre en la impresión, pero no se cambiará cada impresión. De hecho, bien entendido, a pesar de ir hilo de conmutación corrutina conmutación de sobrecarga es menor que, pero después de todo, hay por encima, todavía no podemos decir que corte a corte.

Cambiamos los tipos de escritura y vuelva a intentarlo.

package main

import (
	"time"
)

func main()  {
	for i := 0; i < 10; i++ {
		go func(i int) {
			for {
				i++
			}
		}(i)
	}
	time.Sleep(time.Second)
}

Este programa también está abierto 10 corrutina, tiempo diferente, corrutina no hay impresión, o si no cualquier compilador de lenguaje puede ser considerado como un punto de conexión de co-rutina, por lo que el resultado de esta operación es, para siempre no va a dejar de fumar, porque mientras una en la co-rutina, habría sido i ++, no voy a cambiar. El código de escritura real, es natural que quieren evitar escribir esto.

hilo

Por último, el idioma por defecto le gustaría hablar hilos van manera, sabemos que un hilo puede tener múltiples co-rutinas, a continuación, cuando realmente ejecutar varios procesos al mismo tiempo, la Asociación, al final va a ser un par de hilos?

La respuesta es, la CPU tiene varios nuclear, usar varios hilos . Sabemos que, a pesar de un solo núcleo para ejecutar múltiples hilos, múltiples hilos concurrentes no son ciertas, pero con el fin de ejecutar en la planificación de la CPU. Por el camino, la programación de subprocesos no tiene sentido, ya que el movimiento tiene que ver la programación apropiada más corrutina desde el nivel de idioma. Por lo tanto, hay 1000 corrutinas concurrentes incluso un programa, aunque sólo CPU 4-core, el programa en marcha y funcionando sólo utilizar hasta cuatro hilos.

Publicado 39 artículos originales · ganado elogios 25 · vistas 120 000 +

Supongo que te gusta

Origin blog.csdn.net/u013536232/article/details/104892205
Recomendado
Clasificación