Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Las gorutinas se ejecutan en el mismo espacio de direcciones, por lo que el acceso a la memoria compartida debe estar sincronizado.Las gorutinas comparten memoria a través de la comunicación, en lugar de compartir memoria.
El canal de tipo de referencia es una implementación específica del modo CSP y se utiliza para la comunicación de múltiples rutinas. Implementa la sincronización internamente para garantizar la seguridad de la concurrencia.
Al igual que el mapa, el canal también es una referencia a la estructura de datos subyacente creada por make.
Cuando copiamos un canal o lo usamos para pasar parámetros de función, simplemente copiamos una referencia de canal, por lo que la persona que llama y el destinatario harán referencia al mismo objeto de canal. Como otros tipos de referencia, el valor cero del canal es nulo.
Cuando define un canal, también necesita definir el tipo de valores enviados al canal. Los canales se pueden crear usando la función make() incorporada:
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
De forma predeterminada, el canal se bloquea al recibir y enviar datos, a menos que el otro extremo esté listo, lo que simplifica la sincronización de rutinas sin la necesidad de bloqueos explícitos.
Un canal sin búfer es un canal que no tiene la capacidad de guardar ningún valor antes de recibirlo.
Este tipo de canal requiere que la rutina de envío y la rutina de recepción estén listas al mismo tiempo para completar las operaciones de envío y recepción. Si dos gorutinas no están listas al mismo tiempo, el canal hará que la gorutina que realiza primero la operación de envío o recepción se bloquee y espere.
Esta interacción de envío y recepción al canal es inherentemente sincrónica. Ninguna operación puede existir independientemente de la otra.
La siguiente figura muestra cómo dos gorutinas pueden compartir un valor utilizando canales sin búfer:
make (chan Type)//等价于make (chan Type,0)
Si no se especifica ningún tamaño de búfer, el canal es síncrono y, por lo tanto, se bloquea hasta que el remitente esté listo para enviar y el receptor esté listo para recibir.
Un canal almacenado en búfer es un canal que puede almacenar uno o más valores antes de ser recibido.
Este tipo de canal no requiere que la rutina deba completar el envío y la recepción al mismo tiempo. Los canales también tendrán diferentes condiciones que bloquean las acciones de envío y recepción. La acción de recepción solo se bloqueará si no hay ningún valor en el canal a recibir. La acción de envío solo se bloqueará si el canal no tiene un búfer disponible para acomodar el valor que se envía.
Esto conduce a una gran diferencia entre los canales con y sin búfer: los canales sin búfer garantizan que las rutinas de envío y recepción intercambiarán datos al mismo tiempo; los canales con búfer no tienen tal garantía.
make (chan Type,capacity)
Si se proporciona una capacidad de búfer, el canal es asíncrono. Mientras el búfer tenga espacio no utilizado para enviar datos o contenga datos que se puedan recibir, la comunicación continúa sin bloquearse.
El canal puede usar ok para detectar si el canal todavía está abierto. Si el canal está cerrado, los datos no se leerán.
num ,ok:=<-ch
Puede detectar si un canal está cerrado.De forma predeterminada, el canal es de doble pregunta, es decir, puede enviarle y recibir datos.
Sin embargo, a menudo vemos que se pasa un canal como parámetro y se espera que el valor se use en una dirección, ya sea solo para enviar datos o solo para recibir datos. En este momento, podemos especificar la dirección del canal. La declaración de una variable chamel unidireccional es muy sencilla, de la siguiente manera:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan <- significa que los datos ingresan a la tubería y los datos se escriben en la tubería y se envían a la persona que llama.
<-chan indica que los datos provienen de la tubería. Para la persona que llama, se obtienen los datos de la tubería, que por supuesto es la entrada.
Un canal se puede convertir implícitamente en una cola unidireccional, solo recepción o envío, pero un canal unidireccional no se puede convertir en un canal normal;