Go lee los datos existentes de chan en caché

Hay una rutina de Go concurrente para escribir datos en chan, y la corutina principal de Go es responsable de leer (recibir) datos.

La corutina principal Go crea una cola de canal ch con una capacidad de 100, y la línea 25 pasa la ch a la corutina de escritura. A continuación, la corutina principal Go duerme durante 2 segundos.
Durante este período, la rutina de escritura se ejecuta simultáneamente. La corutina de escritura tiene un bucle for, que escribe 0 a 47 en el canal de la cola, y luego duerme durante 0.3 segundos. El buffer chan tiene una capacidad de 100. Si está lleno, el bloque se producirá hasta que se lea el valor en ch.

La operación de lectura determina primero el número de elementos almacenados en caché en la cola de cambio de caché ch antes de cada lectura.
Si no hay un elemento de amortiguación, duerma durante 0.2 segundos.
Si hay elementos de memoria intermedia, se juzga si el número de elementos de memoria intermedia len (ch) es mayor que MAXREQLEN (30). Si len (ch)> 30, lea 30 elementos en un lote; de ​​lo contrario, lea los elementos len (ch) en un lote.
Después de leer el elemento, haga algo y luego continúe leyendo.

package main

import (
	"fmt"
	"time"
)

var MAXREQLEN = 30

func write(ch chan int) {
	for {
		for i := 0; i < 47; i++ {
			ch <- i
			fmt.Println("successfully wrote", i, "to ch")
		}
		time.Sleep(300 * time.Millisecond)
	}

	//close(ch)
}
func main() {
	//test()

	ch := make(chan int, 100)
	go write(ch)
	time.Sleep(2 * time.Second)

	for {
		numArr := make([]int, 0)
		bufferChan := len(ch)
		if bufferChan > 0 {
			var max int
			if bufferChan > MAXREQLEN {
				max = MAXREQLEN
			} else {
				max = bufferChan
			}
			for i := 0; i < max; i++ {
				v := <-ch
				fmt.Println("read value", v, "from ch")
				numArr = append(numArr, v)
			}
			fmt.Println(numArr)
			fmt.Println("do some thing")
		}
		time.Sleep(200 * time.Millisecond)
		fmt.Println("Sleep(100 * time.Millisecond)")
	}

}

func test() {
	c := make(chan int, 100)

	fmt.Println("1.len:", len(c))

	for i := 0; i < 34; i++ {
		c <- 0
	}

	fmt.Println("2.len:", len(c))

	<-c

	<-c

	fmt.Println("3.len:", len(c))
}

 

127 artículos originales publicados · Me gusta 24 · Visitas 130,000+

Supongo que te gusta

Origin blog.csdn.net/Linzhongyilisha/article/details/104497519
Recomendado
Clasificación