golang中使用多线程和channel通道

package controller

import (
	"context"
	"github.com/gogf/gf/v2/os/grpool"
	"sync"
	"testing"
	"time"
)

func TestChan(t *testing.T) {
	// 创建channel通道
	testChan:= make(chan int,100)
	// 创建线程池
	pool := grpool.New(10)
	// 创建等待组
	wg := sync.WaitGroup{}
	for i := 0; i < 3; i++ {
		// 等待组 +1
		wg.Add(1)
		sonI:=i
		// 从线程池中开启一个线程跑任务
		pool.Add(context.Background(), func(ctx context.Context) {
			if 1==1 {
				testChan <- sonI
				time.Sleep(1000)
			}
			// 线程执行完毕后 等待组 -1
			defer wg.Done()
		})
	}
	// 等待所有线程执行完毕
	wg.Wait()
	// 关闭channel
	close(testChan)
	list:= make([]int,0)
	// 使用for循环读取channel中的数据
	for  {
		val, ok := <-testChan
		if !ok {
			break
		}
		list = append(list,val)
	}

	t.Log(list)
}

posted @   夜洛IT后端技术分享  阅读(252)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示