当前位置: 首页 > news >正文

Go小技巧易错点100例(十七)

Go定时任务

在Go语言中,定时任务(也称为定时器或cron作业)具有多种作用,这些作用在应用程序的开发和运维中非常有用。以下是一些常见使用场景:

  1. 任务调度:定时任务可以在特定的时间点执行特定的任务,如定时清理临时文件、定时备份数据等。这对于维护系统状态和数据安全至关重要。定时任务还可以按照固定的时间间隔重复执行某个任务,例如每隔一段时间更新缓存数据或检查系统状态。
  2. 事件触发:定时任务可以在特定的时间间隔内触发事件,如定时发送心跳包以维持长连接状态或定时检查某个条件是否满足并执行相应的操作。
  3. 性能优化:通过定时任务,可以限制某些操作的频率,避免对系统资源的过度消耗。例如,可以设置一个定时器来限制某个API的调用频率,以避免对后端服务造成过大的压力。
  4. 定时统计与报告:定时任务可以用于定期收集和分析数据,生成统计报告或图表。例如,可以设置一个定时任务来统计系统的接口访问量、用户活跃度等指标,并将结果发送给相关人员或存储到数据库中。
  5. 业务逻辑实现:在某些业务场景中,需要使用定时任务来实现特定的业务逻辑。例如,在电商平台上,可以使用定时任务来设置“双十一”零点商品下单接口开通访问权限;在社交应用中,可以使用定时任务来发送生日祝福或提醒用户完成某些任务。
  6. 自动化运维:定时任务在自动化运维中扮演着重要角色。例如,可以使用定时任务来自动重启服务、更新配置文件、部署新版本等,以减少人工干预并提高运维效率。

总的来说,Go语言中的定时任务具有广泛的应用场景和灵活的使用方法,可以帮助开发人员更好地管理和优化应用程序。通过合理使用定时任务,可以提高系统的稳定性、可用性和可维护性。

下面我们就使用Go语言的一个三方库来实现定时任务:

go get github.com/go-co-op/gocron/v2

使用这个库实现定时任务主要分为三步:

  • 创建定时器实例
  • 增加定时任务到定时器中
  • 启动定时器

其实关键就在于定时任务如何定义,下面我们使用两种方式来实现定时任务:

(1)创建定时器

s, err := gocron.NewScheduler()
if err != nil {fmt.Printf("gocron.NewScheduler err : %v", err)return
}

(2)创建cron类型的定时任务

这个类型的定时任务使用cron表达式进行任务的处理,比如下面代码的cron表达式* * * * * *​就表示每秒触发一次,后面的参数为bool类型,表示是否精确到秒

_, err = s.NewJob(gocron.CronJob("* * * * * *", true), gocron.NewTask(func() {fmt.Printf("CronJob , time : %v \n", time.Now().Format("2006-01-02 15:04:05"))},
))
if err != nil {fmt.Printf("NewJob err : %v", err)return
}

(3)创建DurationJob类型定时任务

这个类型的定时任务是直接使用Go语言的内置类型进行计算,比较简单

_, err = s.NewJob(gocron.DurationJob(3*time.Second), gocron.NewTask(func() {fmt.Printf("DurationJob , time : %v \n", time.Now().Format("2006-01-02 15:04:05"))},
))
if err != nil {fmt.Printf("NewJob err : %v", err)return
}

(4)启动定时任务

s.Start()
select {}

通过控制台我们就可以发现,上面的定时任务是每秒执行一次,下面的定时任务是每三秒执行一次:

CronJob , time : 2024-05-19 10:47:03 
CronJob , time : 2024-05-19 10:47:04 
CronJob , time : 2024-05-19 10:47:05 
DurationJob , time : 2024-05-19 10:47:05 
CronJob , time : 2024-05-19 10:47:06 
CronJob , time : 2024-05-19 10:47:07 
CronJob , time : 2024-05-19 10:47:08 
DurationJob , time : 2024-05-19 10:47:08 
CronJob , time : 2024-05-19 10:47:09 
Cgo简单使用

在Go语言中有一句话叫:“Cgo is not Go”。

Cgo​ 是 Go 语言中用于调用 C 语言代码的工具。它允许 Go 程序与 C 语言库进行交互,使得 Go 可以利用 C 语言中丰富的库和代码资源。通过 Cgo​,Go 程序可以调用 C 函数,使用 C 语言定义的数据类型,甚至可以使用 C 语言的头文件和源文件。

下面我们写一个Cgo的Hello World程序:

首先是c语言代码hello.c

#include <stdio.h>void sayHello() {printf("Hello, World!\n");
}

然后是Go语言代码main.go

package main/*
#include "hello.c"
*/
import "C"
import "fmt"func main() {fmt.Println("Calling C function...")C.sayHello() // 调用 C 函数
}

最后我们运行go run main.go

Calling C function...
Hello, World!

这样就完成了我们的第一个Cgo程序,除此之外Cgo程序还有一些注意事项,比如

  • 确保 C 代码是线程安全的,因为 Go 运行时可能会在不同的线程上并发地调用 C 代码。
  • 避免在 C 代码中使用全局变量,因为这可能会导致数据竞争和其他并发问题。
  • 注意内存管理。Cgo 不会自动为你管理 C 代码分配的内存。如果你从 C 代码分配了内存,你需要在 Go 代码中显式地释放它(使用 C 的 free​ 函数或其他适当的函数)。同样,如果你在 Go 代码中分配了内存并将其传递给 C 代码,你需要确保 C 代码不会在你不再需要它时释放它。

本节完成~

相关文章:

  • InputApc()函数是如何调用ProcessKeyboardInput()函数的?
  • MVC与三层架构分层
  • 用Golang实现图形面积计算
  • HiveSQL实战——大厂面试真题
  • 【JPCS出版】第三届机械、航天技术与材料应用国际学术会议 (MATMA 2024)
  • Go 语言协程管理精解
  • 解决 Go 语言并发问题
  • 我问GPT flutter
  • 2024年10月湖北省自学考试报名流程(5步)
  • LLM概念梳理(一):训练流程之PT、SFT和PO
  • OriginPro快速上手指南:数据可视化与分析的利器
  • Android笔试面试题AI答之Kotlin(18)
  • 本科生毕业答辩全攻略:从开题到终期答辩的全面指南
  • 中国第一起名大师的老师颜廷利: 名字中的姓氏家谱字辈的最新解析
  • Vitis AI 进阶认知(Torch量化基础+映射+量化参数+对称性+每通道+PTQ+QAT+敏感性)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • ES6系统学习----从Apollo Client看解构赋值
  • Java多线程(4):使用线程池执行定时任务
  • LeetCode18.四数之和 JavaScript
  • Markdown 语法简单说明
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • tweak 支持第三方库
  • vue2.0项目引入element-ui
  • 基于遗传算法的优化问题求解
  • 小程序 setData 学问多
  • 走向全栈之MongoDB的使用
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #FPGA(基础知识)
  • #NOIP 2014# day.1 T2 联合权值
  • #php的pecl工具#
  • #pragma once
  • #考研#计算机文化知识1(局域网及网络互联)
  • (09)Hive——CTE 公共表达式
  • (C++17) optional的使用
  • (八)Flink Join 连接
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .CSS-hover 的解释
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net wcf memory gates checking failed
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .Net8 Blazor 尝鲜
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET学习教程二——.net基础定义+VS常用设置
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @requestBody写与不写的情况
  • [ C++ ] STL---string类的使用指南
  • [1525]字符统计2 (哈希)SDUT
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票