golang等待触发事件的实例
作者:思维的深度 发布时间:2024-05-08 10:17:31
标签:golang,等待,事件
我就废话不多说了,大家还是直接看代码吧~
type Wait interface {
// Register waits returns a chan that waits on the given ID.
// The chan will be triggered when Trigger is called with
// the same ID.
Register(id uint64) <-chan interface{}
// Trigger triggers the waiting chans with the given ID.
Trigger(id uint64, x interface{})
IsRegistered(id uint64) bool
}
type list struct {
l sync.RWMutex
m map[uint64]chan interface{}
}
func Newlist() Wait {
return &list{m : make(map[uint64]chan interface{})}
}
//注册
func (w *list) Register(id uint64) <-chan interface{} {
w.l.Lock()
defer w.l.Unlock()
ch := w.m[id]
if ch != nil {
log.Fatal("dup id error")
return nil
}
ch = make(chan interface{},1)
w.m[id] = ch
return ch
}
//触发
func (w *list) Trigger(id uint64, x interface{}) {
w.l.Lock()
ch := w.m[id]
delete(w.m,id)
w.l.Unlock()
if ch != nil {
ch <- x
close(ch)
}
}
//判断该id是否被注册
func (w *list) IsRegistered(id uint64) bool {
w.l.RLock()
defer w.l.Unlock()
_,ok := w.m[id]
return ok
}
示例
var timeOutDuration = time.Minute*10
func main() {
list := Newlist()
rid := uint64(time.Now().UnixNano())
go func() {
ch := list.Register(rid)
fmt.Println("start register:",rid)
if ch == nil {
return
}
select {
case x := <- ch:
fmt.Printf("trigger over id:%d,x:%v\n",rid,x)
case <-time.After(timeOutDuration):
log.Println("timeout error:",rid)
}
}()
time.Sleep(time.Second)
rid2 := uint64(time.Now().UnixNano())
go func() {
ch := list.Register(rid2)
fmt.Println("start register:",rid2)
if ch == nil {
return
}
select {
case x := <- ch:
fmt.Printf("trigger over id:%d,x:%v\n",rid2,x)
case <-time.After(timeOutDuration):
log.Println("timeout error:",rid2)
}
}()
go func() {
time.Sleep(time.Second*5)
list.Trigger(rid,"Hello")
time.Sleep(time.Second*3)
list.Trigger(rid2,"World")
}()
select {
}
}
补充:GO 程序等待一段时间执行
我就废话不多说了,大家还是直接看代码吧~
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now())
//等1秒
time.Sleep(time.Second * 1)
fmt.Println(time.Now())
//等1秒
<-time.After(time.Second * 1)
fmt.Println(time.Now())
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://skaygo.blog.csdn.net/article/details/81842163


猜你喜欢
- """已知列表li = [{"key": 5}, {"key": 9}
- 整数在Python中,整数(integer)是一种内置数据类型,用于表示整数值。Python中的整数类型可以表示任意大小的整数,而不需要考虑
- 所见即所得的文本编辑器目前在网上流传的已经有很多了,并且都比较优秀,就我个人而言,用过的有以下几个: ·
- 1。注意用SQL分析器可以看select出来的东西select right(convert(varchar(30),getdate(),12
- 一、前言如果你自己打印过东西,应该有过这种经历。如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片。比如下面这两张图
- 之前修改两张及以上表的时候,总得需要用几次语句才修改,万一其中一条没修改上,又没事务机制的话,处理很麻烦,于是想到能不能一条语句完成呢? 结
- 中间件是我们在软件开发中的一个古老而强大的概念,当我们在应用程序中使用路由相关模式时,它非常有用。如果您不太了解中间件的含义,Nodejs框
- 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。(1) 选择
- 最近要搭建一个阿里云的LMAP环境,选了CentOS7来做搭建。1.ApacheCentos7默认已经安装httpd服务,只是没有启动。如果
- Python被誉为全世界高效的编程语言,同时也被称作是“胶水语言”,那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备11个知
- 今天要帮前端写一个小后台,就是读取数据然后转成json送给他,让他去展示。数据很简单,但是处理的时候遇到了一个问题,文件中涉及到了中文的处理
- 1. 信号与槽(Signals and slots)信号与槽机制是 PyQt 的核心机制,用于对象之间的通信,也就是实现函数之间的自动调用。
- Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。外键涉及到两个表,其中一
- 1 使用Flask处理表单什么是表单(Form)? 表单是搜集用户数据信息的各种表单元素的集合区域。它的作用是实现用户和服务器的数据交互。通
- >>> "hello".encode("hex") '68656c6c6f
- django台后默认上传文件名在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileFiel
- 请问css如何实现一张图片的倒影。出来的效果就像这样:下面是使用了滤镜来实现倒影的效果:<div style=" width
- 之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查
- 这篇文章主要介绍了python lambda表达式(匿名函数)写法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 零、前言python代码中配置文件是必不可少的内容。常见的配置文件格式有很多中:ini、yaml、xml、properties、txt、py