英文:
Running a Go method using cron
问题
我正在尝试编写一个程序,以在一定时间间隔内连续调用一个方法。我正在使用一个 cron 库来实现这个目标,但当我运行程序时,它只是执行并完成,没有任何输出。
以下是我尝试做的一个基本示例。
非常感谢您的帮助!
package main
import (
	"fmt"
	"github.com/robfig/cron"
)
func main() {
	c := cron.New()
	c.AddFunc("1 * * * * *", RunEverySecond)
	c.Start()
}
func RunEverySecond() {
	fmt.Println("----")
}
英文:
I'm trying to write a program that will continuously call a method at a certain time interval. I'm using a cron library to try and achieve this but when I run the program it just executes and finishes with out any output.
Below is a basic example of what I'm trying to do.
Assistance greatly appreciated!
package main
import (
    "fmt"
	"github.com/robfig/cron"
)
func main() {
    c := cron.New()
    c.AddFunc("1 * * * * *", RunEverySecond)
    c.Start()
}
func RunEverySecond() {
    fmt.Println("----")
}
答案1
得分: 11
你可以等待操作系统发出信号,例如来自用户的CTRL-C。另外,你的cron表达式是每分钟运行一次,即只有当秒数等于1时才会运行。
package main
import (
	"fmt"
	"os"
	"os/signal"
	"time"
	"github.com/robfig/cron"
)
func main() {
	c := cron.New()
	c.AddFunc("* * * * * *", RunEverySecond)
	go c.Start()
	sig := make(chan os.Signal)
	signal.Notify(sig, os.Interrupt, os.Kill)
	<-sig
}
func RunEverySecond() {
	fmt.Printf("%v\n", time.Now())
}
英文:
You can wait for the OS to signal you, e.g. CTRL-C from the user. Also your cron expression was for every minute, i.e. only where seconds == 1.
package main
import (
	"fmt"
	"os"
	"os/signal"
	"time"
	"github.com/robfig/cron"
)
func main() {
	c := cron.New()
	c.AddFunc("* * * * * *", RunEverySecond)
	go c.Start()
	sig := make(chan os.Signal)
	signal.Notify(sig, os.Interrupt, os.Kill)
	<-sig
}
func RunEverySecond() {
	fmt.Printf("%v\n", time.Now())
}
答案2
得分: 6
你可以看到c.Start()在另一个goroutine中运行,所以对c.Start的调用会立即返回。因此,你的程序会在看到任何输出之前就结束了。你可以添加类似time.Sleep(1 * minute)这样的代码,或者为此目的创建一个关闭的channel(或者只是<-make(chan struct{})来永久等待)。
英文:
As you can see c.Start() runs in another goroutine, so the call to c.Start returns immediately. https://github.com/robfig/cron/blob/master/cron.go#L125
So your program finishes earlier than you see any output. You may add something like time.Sleep(1 * minute) or have a close channel for this (or just <-make(chan struct{}) to wait eternally)
答案3
得分: 6
使用外部包来完成这个任务有些过度,time 包已经提供了你所需的一切:
package main
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		c := time.Tick(1 * time.Second)
		for range c {
			// 注意这里故意在同一个 goroutine 中运行函数,
			// 确保只有一个函数在运行。如果可能需要很长时间并且可以安全地同时运行多个函数,
			// 可以在这里添加 "go" 关键字。
			RunEverySecond()
		}
	}()
	// 其他处理或程序的其余部分在这里。
	time.Sleep(5 * time.Second)
	// 或者永远阻塞:
	//select {}
	// 但是,如果这样做,你可以直接将上面的 for 循环放在这里,而不需要将其放入 goroutine 中。
}
func RunEverySecond() {
	fmt.Println("----")
}
英文:
Using an external package for this is overkill, the time package has everything you need:
package main
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		c := time.Tick(1 * time.Second)
		for range c {
			// Note this purposfully runs the function
			// in the same goroutine so we make sure there is
			// only ever one. If it might take a long time and
			// it's safe to have several running just add "go" here.
			RunEverySecond()
		}
	}()
	// Other processing or the rest of your program here.
	time.Sleep(5 * time.Second)
	// Or to block forever:
	//select {}
	// However, if doing that you could just stick the above for loop
	// right here without dropping it into a goroutine.
}
func RunEverySecond() {
	fmt.Println("----")
}
答案4
得分: 4
或者类似这样使用同步等待组。
package main
import (
	"fmt"
	"sync"
	"github.com/robfig/cron"
)
// RunEverySecond 是一直运行的函数。
func RunEverySecond() {
	fmt.Println("----")
	//wg.Done() // 不会释放等待组。
}
func main() {
	wg := &sync.WaitGroup{}
	wg.Add(1)
	c := cron.New()
	c.AddFunc("@every 1s", RunEverySecond)
	c.Start()
	wg.Wait() // 这保证了该程序永远不会退出,以便 cron 按照 cron 间隔继续运行。
}
英文:
or something like this using sync wait group.
package main
import (
	"fmt"
	"sync"
	"github.com/robfig/cron"
)
// RunEverySecond is to run all the time.
func RunEverySecond() {
	fmt.Println("----")
	//wg.Done() // Does not release the waitgroup.
}
func main() {
	wg := &sync.WaitGroup{}
	wg.Add(1)
	c := cron.New()
	c.AddFunc("@every 1s", RunEverySecond)
	c.Start()
	wg.Wait() // This guarantees this program never exits so cron can keep running as per the cron interval.
}
答案5
得分: -1
请确保应用程序始终保持运行,即:
func main() {
    cronJob := cron.New()
    cronJob.Start()
    cronJob.AddFunc("* * * * * ?", PushConfigs)
    for {
    }
}
英文:
Just make sure to keep the application always running, ie:
func main() {
	cronJob := cron.New()
	cronJob.Start()
	cronJob.AddFunc("* * * * * ?", PushConfigs)
	for {
	}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论