网站建设流程和方法找南昌网站开发公司电话

张小明 2026/1/10 12:02:03
网站建设流程和方法,找南昌网站开发公司电话,域名网站是什么,微网站免费制作go语言定时任务工具类#xff0c;支持crontab#xff08;精确到秒#xff09;和 timer 两种模式。 本文介绍了一个基于Go语言的定时任务工具类#xff0c;支持crontab#xff08;精确到秒#xff09;和timer两种模式。工具类使用github.com/robfig/cron/v3包实现#xf…go语言定时任务工具类支持crontab精确到秒和 timer 两种模式。本文介绍了一个基于Go语言的定时任务工具类支持crontab精确到秒和timer两种模式。工具类使用github.com/robfig/cron/v3包实现主要功能包括提供NamedCronJobTask接口定义定时任务支持通过cron表达式或时间间隔两种调度方式实现了任务添加AddTask、更新UpdateTask等功能内部使用map管理任务支持同名任务替换对cron和ticker两种调度方式进行了封装自动处理panic恢复提供了任务日志记录功能该工具类设计灵活可以方便地集成到各种需要定时任务调度的Go应用中。引入包github.com/robfig/cron/v3我的版本 v3.0.1直接见代码1、cron_job_conf.gopackagejobimport(xxx/utils// 自定义工具包包内容见下fmtlogsynctimegithub.com/google/uuidgithub.com/robfig/cron/v3)// 定时任务接口typeNamedCronJobTaskinterface{// 任务名称Name()string// returns a cron expression and/or a time interval.// Scheduling priority:// - If cronSpec is non-empty, it is used (interval is ignored).// - Else, if interval 0, a ticker-based scheduler runs every interval.// - Otherwise, the task is invalid.// Example:// return */5 * * * * *, 0 // cron every 5 seconds// return , 2*time.Hour // ticker every 2 hours// return 0 0 * * *, 10*time.Minute // cron used (every day at 00:00)SpecOrInterval()(cronSpecstring,interval time.Duration)// 执行方法Execute()}// taskType 任务类型typetaskTypeintconst(taskTypeCron taskTypeiotataskTypeTicker)// cronTask 内部任务元数据typecronTaskstruct{specstring// cron 表达式 或 [TICKER:...] 占位符仅用于日志fnfunc()id cron.EntryID// cron 用ticker*time.Ticker// ticker 用stopChanchanstruct{}// 用于安全停止 ticker goroutinetaskType taskType}var(c*cron.Cron cronTaskMapmake(map[string]*cronTask)cronTaskMapMutexsync.RWMutex{})// init 初始化 cron 调度器带秒支持funcinit(){ccron.New(cron.WithSeconds())c.Start()log.Println(cron scheduler started)}// AddTask 添加定时任务。如果之前已存在同名任务则会被覆盖。funcAddTask(named NamedCronJobTask)(string,error){ifnamednil{return,fmt.Errorf(namedCronJobTask is nil)}name:named.Name()ifname{nameanonymous:uuid.New().String()}returnAddTaskWithName(name,named.SpecOrInterval,named.Execute)}// AddTaskWithName 添加命名任务如果之前已存在同名任务则会被覆盖。// specOrInterval 返回 (cronSpec, interval)规则// - 若 cronSpec ! → 使用 cron忽略 interval// - 否则若 interval 0 → 使用 ticker// - 否则返回错误funcAddTaskWithName(namestring,specOrIntervalfunc()(specstring,interval time.Duration),fnfunc(),)(string,error){iffnnil{returnname,fmt.Errorf(task function cannot be nil)}ifspecOrIntervalnil{returnname,fmt.Errorf(specOrInterval function cannot be nil)}cronSpec,interval:specOrInterval()ifname{nameanonymous:uuid.New().String()}ifcronSpecinterval0{returnname,fmt.Errorf(invalid scheduling policy for task %q: must return non-empty cronSpec or interval 0,name,)}wrappedFn:func(){deferutils.RecoverPanic()fn()}cronTaskMapMutex.Lock()defercronTaskMapMutex.Unlock()// 替换已存在的同名任务ifold,ok:cronTaskMap[name];ok{removeTask(old)log.Printf(Replaced existing task: %s,name)}ifcronSpec!{// 使用 cronentryID,err:c.AddFunc(cronSpec,wrappedFn)iferr!nil{returnname,fmt.Errorf(invalid cron spec %q: %w,cronSpec,err)}cronTaskMap[name]cronTask{spec:cronSpec,fn:fn,id:entryID,taskType:taskTypeCron,}log.Printf(Added cron task: %s (spec: %s, ID: %d),name,cronSpec,int64(entryID))}elseifinterval0{// 使用 tickerstopChan:make(chanstruct{})ticker:time.NewTicker(interval)gofunc(){deferfunc(){ifr:recover();r!nil{log.Printf(Recovered panic in ticker task %s: %v,name,r)}ticker.Stop()}()for{select{case-ticker.C:wrappedFn()case-stopChan:return}}}()cronTaskMap[name]cronTask{spec:fmt.Sprintf([TICKER:%v],interval),fn:fn,ticker:ticker,stopChan:stopChan,taskType:taskTypeTicker,}log.Printf(Added ticker task: %s (every %v),name,interval)}returnname,nil}// AddTaskWithName 添加匿名任务通过函数动态获取调度策略。// specOrInterval 返回 (cronSpec, interval)规则// - 若 cronSpec ! → 使用 cron忽略 interval// - 否则若 interval 0 → 使用 ticker// - 否则返回错误funcAddTaskWithoutName(specOrIntervalfunc()(specstring,interval time.Duration),fnfunc())(string,error){name:anonymous:uuid.New().String()returnAddTaskWithName(name,specOrInterval,fn)}// UpdateTask 更新任务调度策略支持在 cron 和 ticker 之间切换。// newSpecOrInterval 应返回新的 (cronSpec, interval)。// 规则// - 若 cronSpec ! → 使用 cron忽略 interval// - 否则若 interval 0 → 使用 ticker// - 否则返回错误//// 要求任务必须已存在。funcUpdateTask(namestring,newSpecOrIntervalfunc()(newSpecstring,newInterval time.Duration))error{ifname{returnfmt.Errorf(task name cannot be empty)}ifnewSpecOrIntervalnil{returnfmt.Errorf(newSpecOrInterval function cannot be nil)}newSpec,newInterval:newSpecOrInterval()ifnewSpecnewInterval0{returnfmt.Errorf(newSpecOrInterval returned invalid spec (%q) and interval (%v): at least one must be valid,newSpec,newInterval)}cronTaskMapMutex.Lock()defercronTaskMapMutex.Unlock()oldTask,exists:cronTaskMap[name]if!exists{returnfmt.Errorf(task not found: %s,name)}ifoldTask.fnnil{returnfmt.Errorf(task function is nil for %s,name)}// 安全停止旧任务removeTask(oldTask)ifnewSpec!{// 切换为 cronwrappedFn:func(){deferutils.RecoverPanic()oldTask.fn()}entryID,e:c.AddFunc(newSpec,wrappedFn)ife!nil{delete(cronTaskMap,name)// 防止残留无效条目returnfmt.Errorf(failed to parse new cron spec %q: %w,newSpec,e)}cronTaskMap[name]cronTask{spec:newSpec,fn:oldTask.fn,id:entryID,taskType:taskTypeCron,}log.Printf(Updated task %s to cron (spec: %s),name,newSpec)}elseifnewInterval0{// 切换为 tickerstopChan:make(chanstruct{})ticker:time.NewTicker(newInterval)gofunc(){deferfunc(){ifr:recover();r!nil{log.Printf(Recovered panic in updated ticker task %s: %v,name,r)}ticker.Stop()}()for{select{case-ticker.C:func(){deferutils.RecoverPanic()oldTask.fn()}()case-stopChan:return}}}()cronTaskMap[name]cronTask{spec:fmt.Sprintf([TICKER:%v],newInterval),fn:oldTask.fn,ticker:ticker,stopChan:stopChan,taskType:taskTypeTicker,}log.Printf(Updated task %s to ticker (interval: %v),name,newInterval)}returnnil}// RemoveTaskByName 删除任务幂等任务不存在也返回 truefuncRemoveTaskByName(namestring)bool{ifname{returntrue}cronTaskMapMutex.Lock()defercronTaskMapMutex.Unlock()iftask,ok:cronTaskMap[name];ok{removeTask(task)delete(cronTaskMap,name)log.Printf(Removed task: %s,name)}returntrue}// Exists 检查任务是否存在funcExists(namestring)bool{cronTaskMapMutex.RLock()defercronTaskMapMutex.RUnlock()_,ok:cronTaskMap[name]returnok}// GetAllTaskNames 获取所有任务名funcGetAllTaskNames()[]string{cronTaskMapMutex.RLock()defercronTaskMapMutex.RUnlock()names:make([]string,0,len(cronTaskMap))forname:rangecronTaskMap{namesappend(names,name)}returnnames}// Stop 停止整个调度器funcStop(){log.Println(Stopping cron scheduler...)c.Stop()// 停止 cron 调度器不再触发新任务cronTaskMapMutex.Lock()defercronTaskMapMutex.Unlock()// 复用 removeTask 清理所有任务资源for_,task:rangecronTaskMap{removeTask(task)}log.Println(All scheduled tasks stopped)}// 内部使用安全移除一个任务funcremoveTask(task*cronTask){switchtask.taskType{casetaskTypeCron:c.Remove(task.id)casetaskTypeTicker:iftask.ticker!nil{task.ticker.Stop()}iftask.stopChan!nil{close(task.stopChan)// 唯一关闭点task.stopChannil// 防止重复 close虽已加锁但更安全}}}2、panic_tookit.gopackageutilsimport(logruntime/debug)// 捕获 PanicfuncRecoverPanic(){ifr:recover();r!nil{log.Printf(panic recovered: %v\n%s,r,debug.Stack())// 后期这里还可以 SendMetrics、SendAlert、Sentry.Capture等指标}}// 在捕获 Panic 下运行某个方法funcRunWithRecoverPanic[T any](data T,fnfunc(T)){deferRecoverPanic()// 增加一层防火墙fn(data)}// 在捕获 Panic 下运行某个方法无入参funcRunWithRecoverPanic2(fnfunc()){deferRecoverPanic()// 增加一层防火墙fn()}// 在捕获 Panic 下 异步运行(goroutine) 某个方法funcAsyncRunWithRecoverPanic[T any](data T,fnfunc(T)){gofunc(d T){deferRecoverPanic()// 增加一层防火墙fn(d)}(data)}// 在捕获 Panic 下 异步运行(goroutine) 某个方法无入参funcAsyncRunWithRecoverPanic2(fnfunc()){gofunc(){deferRecoverPanic()// 增加一层防火墙fn()}()}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

湖北商城网站建设app制作免费官网

远程访问策略规划全解析 在当今数字化办公的时代,远程访问企业网络资源变得越来越普遍。为了确保远程访问的安全性、高效性和经济性,需要精心规划远程访问策略。本文将详细介绍远程访问策略规划的各个方面,包括日志记录、认证方法、虚拟专用网络(VPN)以及无线网络访问规划…

张小明 2026/1/2 7:06:21 网站建设

东莞营销网站建设直播福建省建设监理公司网站

Langflow RAG 技术架构与实现深度解析 在大语言模型(LLM)应用快速落地的今天,如何高效构建稳定、可解释、可维护的 RAG(检索增强生成)系统,已成为开发者面临的核心挑战之一。传统方式依赖大量胶水代码串联组…

张小明 2026/1/7 5:02:03 网站建设

网站建设费用报价单深圳网站建设公司613

跨端开发的现实困境与破局之道 【免费下载链接】uni-app A cross-platform framework using Vue.js 项目地址: https://gitcode.com/dcloud/uni-app 在当今多端并行的移动互联网时代,开发者们面临着前所未有的挑战。你是否曾经历过这样的场景:为微…

张小明 2026/1/2 20:09:54 网站建设

常州模板网站建设咨询微信公众号开发平台

Kotaemon如何检测用户情绪?情感分析插件介绍 在智能客服系统日益普及的今天,一个常见的尴尬场景是:用户已经明显表现出不满甚至愤怒,而对话机器人却还在用“感谢您的反馈”之类的标准化语气回应。这种“无感交互”不仅无法解决问题…

张小明 2026/1/2 21:35:37 网站建设

罗定市城乡规划建设局网站好用的做图网站有哪些

第一章:Open-AutoGLM金融账单查询系统概述Open-AutoGLM 是一款专为金融机构设计的智能账单查询系统,融合了自然语言处理与自动化数据检索技术,旨在提升用户在复杂账单数据环境中的查询效率与准确性。系统基于 GLM 大语言模型构建,…

张小明 2026/1/3 6:14:53 网站建设

单页网站如何做cpa淄博周村网站建设哪家好

在大数据时代,数据驱动的决策和自动化系统已成为企业竞争力的核心。机器学习模型作为数据分析的重要工具,广泛应用于推荐系统、风险评估、客户细分、预测分析等场景。然而,随着模型数量的增长、迭代频率的加快以及团队协作的复杂化&#xff0…

张小明 2026/1/2 21:12:18 网站建设