一个Go新手所以请原谅我的问题的答案是否非常简单,但我花了将近四个小时的时间尝试使用Gin Framework编写的API Facktory Go Worker。以下是我的主要功能:
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
go func() {
for i := 0; i < 10000; i++ {
produce() // Function to push jobs to Faktory
}
}()
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
mgr := worker.NewManager()
mgr.Register("SomeJob", someFunc)
// use up to N goroutines to execute jobs
mgr.Concurrency = 20
// pull jobs from these queues, in this order of precedence
mgr.Queues = []string{"critical", "default", "bulk"}
// Start processing jobs, this method does not return
mgr.Run()
}
在mgr.Run()
和r.Run()
之外的第一个调用最终会阻止另一个,所以如果在mgr.Run()
之前放置r.Run()
,则会从faktory服务器中取出作业并执行但是如果在r.Run()
之前调用mgr.Run()
,则服务器无法启动,反之亦然。任何帮助解决这个问题或指导我自己解决这个问题的方向都将受到高度赞赏。
faktory服务器使用此image在docker容器中运行,但作业被推送到faktory服务器,所以我认为这里没有任何配置问题。
答案 0 :(得分:1)
由于两个调用都是阻塞的,你需要在一个单独的goroutine中执行第一个调用,无论你想要的是什么。第二个应该正常执行,以阻止main
退出。
func main() {
// ...
go r.Run()
// ...
mgr.Run()
}
或
func main() {
// ...
go mgr.Run()
// ...
r.Run()
}