流沙团
channel的关闭和广播
2019-11-28 流沙团


代码主要测试 golang中 channel的生产者和接受者的使用方式







Demo1:


package ch8

import (
"fmt"
"sync"
"testing"
)

func Producer(ch chan int, wg *sync.WaitGroup) {
//生产者
go func() {
for i := 0; i < 50; i++ {
ch <- i
}
close(ch)
wg.Done()
}()
}

func Consumer(ch chan int, wg *sync.WaitGroup) {
//消费者
go func() {
for {
if data, ok := <-ch; ok {
fmt.Println(data)
} else {
break
}
}
wg.Done()
}()
}

func TestChannel(t *testing.T) {
var wg sync.WaitGroup
ch := make(chan int, 1)
wg.Add(1)
Producer(ch, &wg)
wg.Add(1)
Consumer(ch, &wg)
wg.Add(1)
Consumer(ch, &wg)
wg.Add(1)
Consumer(ch, &wg)

wg.Wait()
}










Demo2:











package gy_close

import (
"fmt"
"testing"
"time"
)

func isCancelled(cancelChan chan struct{}) bool {
select {
case <-cancelChan:
return true
default:
return false
}
}

func cancel_1(cancelChan chan struct{}) {
cancelChan <- struct{}{}
}

func cancel_2(cancelChan chan struct{}) {
close(cancelChan)
}

func TestCancel(t *testing.T) {
cancelChan := make(chan struct{}, 0)
for i := 0; i < 5; i++ {
go func(i int, cancelCh chan struct{}) {
for {
if isCancelled(cancelCh) {
break
}
time.Sleep(time.Millisecond * 5)
}
fmt.Println(i, "Cancelled")
}(i, cancelChan)
}
cancel_2(cancelChan)
time.Sleep(time.Second * 1)
}









发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容