• 关于了解开源项目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 这个是 实现任务执行的关键代码之一。

  • 相关阅读:
    向你的C语言项目中加入多线程
    <解析>speaker verification模型中的GE2E损失函数
    【笔记】 springCloud-configServer配置中心
    springboot--ActiveMQ--消息队列
    Fdfs上传的图片批量删除
    【笔记】负载均衡Robbin之不同服务使用不同的策略
    【笔记】Ribbon负载均衡伪随机算法
    【笔记】01 -- Spring-Cloud介绍
    linux防火墙
    SpringBoot起飞系列-使用idea搭建环境(二)
  • 原文地址:https://www.cnblogs.com/tgzmos/p/14837702.html
Copyright © 2020-2023  润新知