golang [Golang]执行长时间运行的作业并流式传输实时输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang [Golang]执行长时间运行的作业并流式传输实时输出相关的知识,希望对你有一定的参考价值。

func main() {
	cmd := exec.Command("sh", "-c", "cd ../../bin/worker; ./run.sh")
    // some command output will be input into stderr
    // e.g.
    // cmd := exec.Command("../../bin/master_build")
    // stderr, err := cmd.StderrPipe()
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		fmt.Println(err)
	}

	err = cmd.Start()
	fmt.Println("The command is running")
	if err != nil {
		fmt.Println(err)
	}
	
	// print the output of the subprocess
	scanner := bufio.NewScanner(stdout)
	for scanner.Scan() {
		m := scanner.Text()
		fmt.Println(m)
	}
	cmd.Wait()
}

Golang Robfig cron AddFunc 不会动态运行作业

【中文标题】Golang Robfig cron AddFunc 不会动态运行作业【英文标题】:Golang Robfig cron AddFunc does not dynamically run the jobs 【发布时间】:2021-12-01 00:09:07 【问题描述】:

我正在使用 robfig/cron 模块开发 cron 作业服务。我面临的问题是它无法动态运行 cron 作业功能。例如,参考下面的代码

    mapp := map[int]string1: "one", 2: "two", 3: "three"

    cr := cron.New()


    for integ, spell := range mapp 
        cr.AddFunc("@every 2s", func()  
          fmt.Println("Running Cron Spell:", spell, "Integer:",integ))

    

    cr.Start() 

每2秒输出如下

Running Cron Spell: three Integer: 3
Running Cron Spell: three Integer: 3
Running Cron Spell: three Integer: 3

所有 3 个 cron 作业的输出都是相同的。我期待它会给出这样的输出。

Running Cron Spell: one Integer: 1
Running Cron Spell: two Integer: 2
Running Cron Spell: three Integer: 3

我不确定这是一个错误还是我做错了。我的目标是让 cron 作业根据配置的值动态运行。有什么解决方法可以让它成为我想要的输出吗?

【问题讨论】:

【参考方案1】:

在循环中重新分配范围变量:

    for integ, spell := range mapp 
        integ, spell := integ, spell
        cr.AddFunc("@every 2s", func()  
          fmt.Println("Running Cron Spell:", spell, "Integer:",integ))

    

范围变量与每次迭代中重复使用的变量相同。如果你关闭它,闭包(函数字面量)将看到迭代中的最后一个值。

【讨论】:

以上是关于golang [Golang]执行长时间运行的作业并流式传输实时输出的主要内容,如果未能解决你的问题,请参考以下文章

golang 跨平台编译

Golang记录计算函数执行耗时运行时间的一个简单方法

golang cron 定时任务

Golang入门到项目实战 golang中的if语句

Golang之goroutine

golang exec 在正在运行的二进制/进程上执行命令