91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用go實現Event事件

發布時間:2021-06-23 14:13:54 來源:億速云 閱讀:381 作者:chen 欄目:編程語言

這篇文章主要講解了“怎么用go實現Event事件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用go實現Event事件”吧!

描述

go協程之間用通道通信,如何將它改造成事件形式。

需求描述

以下是我的需求

e := NewEvent()
//協程1等待結果, 10是等待時間
e.Wait(10)
//協程2發送結果
e.Send(xxxx)

原理

原理比較簡單,不描述了

示例

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實現Event事件”的內容了,經過本文的學習后,相信大家對怎么用go實現Event事件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

广安市| 公安县| 专栏| 吉首市| 泸水县| 岳阳市| 开封市| 桐乡市| 德江县| 临猗县| 玉环县| 岚皋县| 台南市| 承德市| 克山县| 弋阳县| 上蔡县| 青州市| 泗水县| 开封市| 巴彦淖尔市| 阿鲁科尔沁旗| 沂源县| 固阳县| 若羌县| 定边县| 郁南县| 乌拉特中旗| 阿勒泰市| 泸定县| 五河县| 新营市| 宁化县| 民乐县| 泰和县| 大理市| 讷河市| 长垣县| 东莞市| 蒙山县| 清远市|