重新研究go的并发模型.



go里面可以实现很多并发模型的优雅解决方案. 总结起来.

package main

import (
	"fmt"
	"time"
)

var bufChan chan int = make(chan int, 1000)
var msgChan chan int = make(chan int) // 用一个channel来卡主主线程, 否则主线程死了, 所有子线程强制结束了.

// write data to channel
func writer(max int) {
	for {
		for i := 0; i < max; i++ { // 简单的向channel中放入一个整数
			bufChan <- i
			time.Sleep(1 * time.Millisecond) //控制放入的频率
		}
	}
}

// read data fro m channel
func reader(max int) {
	for {
		r := <-bufChan
		fmt.Printf("read value: %d\n", r)
	}

	// 通知主线程,工作结束了,这一步可以省略
	msgChan <- 1
}

func main() {
	max := 100
	go writer(max)
	go reader(max)

	// writer 和reader的任务结束了,主线程会得到通知
	res := <-msgChan
	fmt.Printf("task is done: value=%d\n", res)
}

posted on 2024-06-08 07:06  张博的博客  阅读(1)  评论(0编辑  收藏  举报

导航