Comentarios sobre el canal Golang

Gracias referirse a la -http el original: //bjbsair.com/2020-03-27/tech-info/7058/
Introducción

Goroutine y el canal son las dos piedras angulares de lenguaje de programación concurrente Go. Goroutine para la ejecución de tareas concurrentes, Canal para sincronizar la comunicación entre goroutine.

En Golang filosofía concurrente, hay una muy famosas palabras:

No se comunican por la memoria de compartir; en cambio, comparten una memoria mediante la comunicación.

Medios: no se comunican a través de memoria compartida y la memoria compartida para lograr a través de la comunicación, que se basa el modelo CSP (Comunicación secuencia del proceso), se conoce como comunicación de procesos secuenciales.

Ir abogan por el uso de métodos de comunicación en lugar de la memoria compartida, cuando un goroutine necesidades goroutine y otra distribución de los recursos, Canal tenderá un puente sobre la brecha entre ellos y proporcionar mecanismos de seguridad para garantizar la sincronización.

Golang Channel análisis detallado

Canal en una cola o esencialmente siguen FIFO principio (primero en entrar, primero en salir),

Crear un canal

Crear un canal se necesitan palabras clave de la marca , el formato es el siguiente:

通道实例 := make(chan 数据类型)
  • Tipo de datos: tipo de elemento dentro del canal de transmisión.
  • Ejemplo Canal: mango canal creado por marca.

Utilizar el canal

Una vez creado el canal, puede utilizar el canal para la transmisión y recepción de operaciones.

Comentario

canal de escritura utilizar un operador especial <-, formato de datos se transmite a través del canal:

通道变量 <- 值

(Puede entenderse simplemente como el sentido de la flecha para transferir el valor del destino final)

// 创建一个空接口通道  
ch := make(chan interface{})  
// 将0放入通道中  
ch <- 0  
// 将hello字符串放入通道中  
ch <- "hello"

Leer

Utilizar el canal misma lectura <- operador, la recepción de canal tiene las siguientes características:

  1. operación transceptora se realiza entre diferentes canales de dos goroutine.
  2. Desde el canal de datos en la ausencia del procesamiento de lado de recepción, lado de la transmisión de datos continuará a obstruir, por lo que el canal debe ser recibida en otro de goroutine.
  3. Continuará recibir el bloque de datos de transmisión hasta el lado de transmisión.

Recepción de un canal de datos hay 4 redacción:

  1. El bloqueo de la recepción

El bloqueo de modo de recepción de datos, sólo un valor recibido, en el siguiente formato:

data := <-ch

Cuando la declaración se programa se bloqueará hasta que se recibe y se le asigna a los datos variables de datos ejecutado.

  1. Sin bloqueo de recepción de datos

Utilizar sin bloqueo cuando se reciben datos desde el canal, la declaración no se produce la obstrucción, el siguiente formato:

data, ok := <-ch

datos: indica que los datos recibidos. Cuando no se reciben datos, los datos de valor cero tipo de canal.

OK: indica si los datos recibidos.

Características: no bloqueante método de recepción de canales puede provocar un uso intensivo de la CPU, por lo que no se recomienda su uso.

  1. Ignorar los datos recibidos

Ignorar los datos devueltos por el canal, en el siguiente formato:

<-ch

Características: Este método se bloquea, el programa debe esperar hasta que el canal de retorno seguirá a bajar.

  1. bucle de recibir

Recepción de canal de datos puede ser prestado para la gama de declaración pluralidad de elementos receptores operación, el formato siguiente:

for data := range ch {  
    // do sth.  
}

Ch es el canal puede ser atravesada, atravesando el resultado es los datos recibidos. tipo de datos es el tipo de datos del canal. Atravesando variables obtenidas para una sola, es decir, en los datos de ejemplo anteriores.

De lectura / escritura único canal

En general, el canal es bidireccional, es decir, los datos se pueden introducir y de salida. Sin embargo, con el fin de cumplir una serie de escenarios de negocio específica, el funcionario también proporciona soporte únicamente lectura (de sólo lectura) o sólo admite escritura (sólo escritura) formato de canal es la siguiente:

//定义只读通道  
ch_r := <-chan interface{}  
//定义只写通道  
ch_w := <-chan interface{}

búfer de canal

búfer de canal de idioma Ir (canal buffer) es un canal que puede almacenar uno o más valores antes de ser recibido. Este tipo de paso no es obligatorio que esté terminado entre el envío y la recepción simultánea goroutine. las condiciones del canal bloqueará la transmisión y la operación de recepción serán diferentes. Sólo hay ningún valor en el canal que desea recibir, se bloqueará la operación de recepción. Sólo cuando el valor de la canal receptora de búfer no está disponible para ser transmitida, se bloqueará la operación de transmisión.

tampón de Canal se define como sigue:

通道实例 := make(chan 通道类型, 缓冲大小)
  • Tipo de canal: el uso sin búfer y el canal es consistente, que afecta a la transmisión y recepción de datos del tipo de canal.
  • Tamaño de búfer: determina el número de canales puede ahorrar hasta elementos de.
  • instancia de canal: se crea a partir de la instancia de canal.

Aquí tomo prestada la siguiente imagen para ilustrar este canal principio

Golang Channel análisis detallado

  1. El goroutine izquierda continuar para tapar canal de datos
  2. goroutine seguir tomando los datos de derecha desde el carril
  3. Una lectura / escritura, sincronización
  4. El goroutine izquierda todos los datos se ha puesto otra vez, pero esta vez el canal de datos restante también, goroutine todo el derecho sigue trabajando

canal sin búfer

Ir lenguaje canal sin búfer (canal sin búfer) que no son la posibilidad de guardar el valor del canal antes de recibir cualquier. Este tipo de requisitos de canal de transmisión goroutine goroutine recibir simultáneamente y listo para completar la transmisión y recepción operaciones.

canal de modo sin memoria intermedia se define como sigue:

通道实例 := make(chan 通道类型)
  • Tipo de canal: el uso sin búfer y el canal es consistente, que afecta a la transmisión y recepción de datos del tipo de canal.
  • Tamaño del búfer: 0
  • instancia de canal: se crea a partir de la instancia de canal.

Para decirlo más claramente, también encontré una pieza de tabla adicional para ilustrar:

Golang Channel análisis detallado

En el paso 1, dos canales de llegada son goroutine, pero que no comenzó la transmisión o recepción. En el paso 2, goroutine a la mano izquierda en el canal, que simulan el comportamiento del canal a los datos de transmisión. En este caso, el canal estará bloqueado hasta goroutine intercambio se ha completado. En el paso 3, goroutine la mano derecha en el canal, que se recibe desde el canal en los datos analógicos. Al igual que este goroutine se bloqueará en el canal hasta que el cambio se haya completado. En el paso 4 y 5, el intercambio, y en última instancia en el paso 6, son dos goroutine sus manos hacia fuera de la canal en el que el análogo se libera goroutine bloqueado. Dos goroutine ahora puede hacer otras cosas.

resumen

GoLang canal es una herramienta importante para apoyar estable concurrente y operación eficiente del sistema, sólo es plenamente entenderlo, para encontrar los programas más críticos en el desarrollo de negocios y solución de problemas. Conócete a ti mismo, conocerse a sí mismo.

Artículos originales publicados 0 · ganado elogios 0 · Vistas 267

Supongo que te gusta

Origin blog.csdn.net/zxjoke/article/details/105140013
Recomendado
Clasificación