关于了解开源项目PPGo_Job 源码研究

问题: 一个结构体的 一个函数元素,是怎么编译执行的?

下面写一个demo测试一下

package main

import "fmt"
import "time"

type Job struct {
    JobKey     int                            // jobId = id*10000+serverId
    Id         int                            // taskID
    Name       string                         // 任务名称
    RunFunc    func(time.Duration) *JobResult // 执行函数
}

type JobResult struct {
    OutMsg    string
    ErrMsg    string
    IsOk      bool
    IsTimeout bool
}

func NewCommandJob(id int, serverId int, name string, command string) *Job {
    job := &Job{
        Id:   id,
        Name: name,
    }

    job.JobKey = serverId
    job.RunFunc = func(timeout time.Duration) (jobresult *JobResult) {
        jobresult = new(JobResult)
        jobresult.IsTimeout = false
        fmt.Println(name)
        fmt.Println(command)
        return jobresult
    }
    return job
}



func main() {
    
    job := NewCommandJob(10,20,"ssss","ls")
    fmt.Println(job)
    timeout := time.Duration(time.Hour * 24)
    job.RunFunc(timeout)
}

执行  go  run main.go 结果,打印的  job 结构体数据是   &{20 10 0 0  0 ssss 0xc6340 0 false}

而 job.RunFunc() 执行后,能够正常打印处理   job := NewCommandJob(10,20,"ssss","ls") 传递的参数,说明, 在给job。runfunc = ... 赋值函数代码,在go编译的时候,把所有的变量数据都编译并放到了 job 实例 。


 

关于 任务执行流程梳理:

启动后,自动加载已经放到数据库的任务,并执行的流程:

1.首先是 main.go 中的 jobs.InitJobs()执行。在 jobs/init.go的InitJobs ,执行先从数据库查询出来需要执行的任务数据,通过jobs/jobs.go 的NewJobFromTask 方法 形成一个job的实例的切片,在这个方法中一个任务根据执行的服务器ip不同,形成一个任务多个job实例。

   从源码可以看到 根据 执行服务器的不同区调用了不同的方法,这些方法就是实际对job实例的赋值。这里有最重要的一个属性是  job.RunFunc 这个是 实现任务执行的关键代码之一。

 

posted @ 2021-06-01 16:41  语不停  阅读(200)  评论(0编辑  收藏  举报