描述
之前文章中实现了event事件模型,实际使用中发现了几个问题
-
并发会出现情况send先执行, 此时还没有waiter。将wait拆分成addWaiter和wait()
-
不能使用缓冲通道。会出现send完成,wait还未收到的情况。
用法修正
e.Reset()
waiter := e.AddWaiter()
waiter := e.Wait(waiter, xxx)
e.Send(xxx)
事件实现
package common
import (
"context"
"errors"
"go.uber.org/zap"
"time"
)
var NOT_USED = struct{
}{
}
func NewEvent() *Event {
e := &Event{
log: zap.S(),
}
e.Reset()
return e
}
type Event struct{
//监听者
waiters