Goは既存のキャッシュされたchanデータを読み取ります

chanにデータを書き込むための並行Goコルーチンがあり、Goメインコルーチンはデータの読み取り(受信)を担当します。

Goメインコルーチンは、容量100のchanキューchを作成し、25行目は、chを書き込みコルーチンに渡します。次に、Goメインコルーチンは2秒間スリープします。
この期間中、書き込みコルーチンは同時に実行されます。書き込みコルーチンにはforループがあり、chanキューchに0〜47を順番に書き込み、0.3秒間スリープします。バッファchanの容量は100です。それがいっぱいの場合、ブロックはchの値が読み取られるまで発生します。

読み取り操作では、各読み取りの前に、まずキャッシュチャンキューchにキャッシュされる要素の数を決定します。
バッファ要素がない場合は、0.2秒間スリープします。
バッファ要素が存在する場合、バッファ要素の数len(ch)がMAXREQLEN(30)より大きいかどうかが判断されます。len(ch)> 30の場合、1つのバッチで30要素を読み取ります。それ以外の場合、1つのバッチでlen(ch)要素を読み取ります。
要素を読んだ後、何かをしてから読み続けます。

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元の記事 ウォン称賛24 ビュー130 000 +

おすすめ

転載: blog.csdn.net/Linzhongyilisha/article/details/104497519