您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用go實(shí)現(xiàn)Event事件”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么用go實(shí)現(xiàn)Event事件”吧!
go協(xié)程之間用通道通信,如何將它改造成事件形式。
以下是我的需求
e := NewEvent() //協(xié)程1等待結(jié)果, 10是等待時(shí)間 e.Wait(10) //協(xié)程2發(fā)送結(jié)果 e.Send(xxxx)
原理比較簡(jiǎn)單,不描述了
package common import ( "go.uber.org/zap" "sync" "time" ) var NOT_USED interface{} = struct{}{} func NewEvent() *Event { e := &Event{ log: zap.S(), } e.Reset() return e } type Event struct{ waiters sync.Map log *zap.SugaredLogger } func (e *Event) Wait(timeout time.Duration) interface{}{ ticker := time.NewTicker(time.Second*timeout) defer ticker.Stop() resultChan := make(chan interface{}, 1) e.waiters.Store(resultChan, true) select{ case result := <- resultChan: if result == NOT_USED{ return nil } return result case <- ticker.C: close(resultChan) } e.waiters.Delete(resultChan) return nil } func (e *Event) Send(result interface{}){ e.waiters.Range(func(k, v interface{})bool{ resultChan := k.(chan interface{}) select{ case resultChan <- result: e.waiters.Delete(resultChan) default: e.log.Warnf("Event.Send %p resultChan=%d, result=%v", e, len(resultChan), result) } return true }) } func (e *Event) Reset(){ e.waiters.Range(func(k, v interface{})bool{ resultChan := k.(chan interface{}) resultChan <- NOT_USED e.waiters.Delete(resultChan) return true }) }
感謝各位的閱讀,以上就是“怎么用go實(shí)現(xiàn)Event事件”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么用go實(shí)現(xiàn)Event事件這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。