• beego task


    beego 的架构

    beego 的整体设计架构如下所示:

    beego 的执行逻辑

    既然 beego 是基于这些模块构建的,那么它的执行逻辑是怎么样的呢?beego 是一个典型的 MVC 架构,它的执行逻辑如下图所示:

    beego 项目结构

    一般的 beego 项目的目录如下所示:

    1. ├── conf
    2. │ └── app.conf
    3. ├── controllers
    4. │ ├── admin
    5. │ └── default.go
    6. ├── main.go
    7. ├── models
    8. │ └── models.go
    9. ├── static
    10. │ ├── css
    11. │ ├── ico
    12. │ ├── img
    13. │ └── js
    14. └── views
    15. ├── admin
    16. └── index.tpl

    从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构, main.go 是入口文件。

    你可以通过 bee 工具来新建项目

     

     从上面的架构图可以看出task是相对独立的模块。


    task

    玩过 linux 的用户都知道有一个计划任务的工具 crontab,我们经常利用该工具来定时的做一些任务,但是有些时候我们的进程内也希望定时的来处理一些事情,例如定时的汇报当前进程的内存信息,goroutine 信息等。或者定时的进行手工触发 GC,或者定时的清理一些日志数据等,所以实现了秒级别的定时任务,首先让我们看看如何使用:

    1. 初始化一个任务

      tk1 := task.NewTask("tk1", "0 12 * * * *", func(ctx context.Context) error { fmt.Println("tk1"); return nil })

      函数原型:

      NewTask(tname string, spec string, f TaskFunc) *Task

      • tname 任务名称
      • spec 定时任务格式,请参考下面的详细介绍
      • f 执行的函数 func() error
    2. 可以测试开启运行

      可以通过如下的代码运行 TaskFunc,和 spec 无关,用于检测写的函数是否如预期所希望的这样:

      1. err := tk.Run()
      2. if err != nil {
      3. t.Fatal(err)
      4. }
    3. 加入全局的计划任务列表

      task.AddTask("tk1", tk1)
    4. 开始执行全局的任务

      1. task.StartTask()
      2. defer task.StopTask()

    spec 详解

    spec 格式是参照 crontab 做的,详细的解释如下所示:

    1. //6个字段分别表示:
    2. // 秒钟:0-59
    3. // 分钟:0-59
    4. // 小时:1-23
    5. // 日期:1-31
    6. // 月份:1-12
    7. // 星期:0-60 表示周日)
    8. //还可以用一些特殊符号:
    9. // *: 表示任何时刻
    10. // ,: 表示分割,如第三段里:2,4,表示 2 点和 4 点执行
    11. //   -:表示一个段,如第三端里: 1-5,就表示 15
    12. // /n : 表示每个n的单位执行一次,如第三段里,*/1, 就表示每隔 1 个小时执行一次命令。也可以写成1-23/1.
    13. /
    14. // 0/30 * * * * *30 秒 执行
    15. // 0 43 21 * * * 21:43 执行
    16. // 0 15 05 * * *    05:15 执行
    17. // 0 0 17 * * * 17:00 执行
    18. // 0 0 17 * * 1 每周一的 17:00 执行
    19. // 0 0,10 17 * * 0,2,3 每周日,周二,周三的 17:0017:10 执行
    20. // 0 0-10 17 1 * * 毎月1日从 17:007:10 毎隔 1 分钟 执行
    21. // 0 0 0 1,15 * 1 毎月1日和 15 日和 一日的 0:00 执行
    22. // 0 42 4 1 * *     毎月1日的 4:42 分 执行
    23. // 0 0 21 * * 1-6   周一到周六 21:00 执行
    24. // 0 0,10,20,30,40,50 * * * *  每隔 10 分 执行
    25. // 0 */10 * * * *        每隔 10 分 执行
    26. // 0 * 1 * * *         从 1:01:59 每隔 1 分钟 执行
    27. // 0 0 1 * * *         1:00 执行
    28. // 0 0 */1 * * *        毎时 0 分 每隔 1 小时 执行
    29. // 0 0 * * * *         毎时 0 分 每隔 1 小时 执行
    30. // 0 2 8-20/3 * * *       8:02,11:02,14:02,17:02,20:02 执行
    31. // 0 30 5 1,15 * *       1 日 和 15 日的 5:30 执行

    调试模块(已移动到utils模块)

    我们经常需要打印一些参数进行调试,但是默认的参数打印总是不是很完美,也没办法定位代码行之类的,所以 beego 的 task 模块进行了 debug 模块的开发,主要包括了两个函数:

    • Display() 直接打印结果到 console
    • GetDisplayString() 返回打印的字符串

    两个函数的功能一模一样,第一个是直接打印到 console,第二个是返回字符串,方便用户存储到日志或者其他存储。

    使用很方便,是 key/value 串出现的,如下示例:

    Display("v1", 1, "v2", 2, "v3", 3)

    打印结果如下:

    1. 2013/12/16 23:48:41 [Debug] at TestPrint() [/Users/astaxie/github/beego/task/debug_test.go:13]
    2. [Variables]
    3. v1 = 1
    4. v2 = 2
    5. v3 = 3

    指针类型的打印如下:

    1. type mytype struct {
    2. next *mytype
    3. prev *mytype
    4. }
    5. var v1 = new(mytype)
    6. var v2 = new(mytype)
    7. v1.prev = nil
    8. v1.next = v2
    9. v2.prev = v1
    10. v2.next = nil
    11. Display("v1", v1, "v2", v2)

    打印结果如下:

    1. 2013/12/16 23:48:41 [Debug] at TestPrintPoint() [/Users/astaxie/github/beego/task/debug_test.go:26]
    2. [Variables]
    3. v1 = &task.mytype{
    4. next: &task.mytype{
    5. next: nil,
    6. prev: 0x210335420,
    7. },
    8. prev: nil,
    9. }
    10. v2 = &task.mytype{
    11. next: nil,
    12. prev: &task.mytype{
    13. next: 0x210335430,
    14. prev: nil,
    15. },
    16. }

    参考:

    Task Module - beego: simple & powerful Go app framework

    GitHub - beego/beego: beego is an open-source, high-performance web framework for the Go programming language.

  • 相关阅读:
    一个arm平台工程段错误的排查
    Spark的内存管理
    Git(三).git 文件夹详解
    自动化测试难题,验证码如何解决
    【PE】PE文件结构(一)
    v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码
    java毕业设计道路桥梁工程知识文库系统Mybatis+系统+数据库+调试部署
    Day17-Java进阶-网络编程(IP, 端口, 协议)&TCP和UDP&三次握手和四次挥手
    [SpringMVC]基于RESTful页面数据交互案例
    文件字符流说明
  • 原文地址:https://blog.csdn.net/asdcls/article/details/126498440