在SINGLE光纤进程中运行后台任务



我有一个删除过时文件的后台任务(cleanUp(。

func main() {
// 4 procs/childs max
runtime.GOMAXPROCS(4)
// start a cleanup cron-job
go cleanUp()
app := fiber.New(fiber.Config{
Prefork:   true,
})
app.Post("/", handleFileupload)
log.Fatal(app.Listen(":4000"))
}
func cleanUp() {
fmt.Println("Cleaning Up..")
for {
// deletes old files here
time.Sleep(60 * time.Second)
}
}

此时CCD_ 2在所有4个进程上运行并打印CCD_ 3 4次。

但我希望它只在一个进程上运行,并打印一个Cleaning Up..。我尝试过waitGroups和频道,但没能达到我想要的效果。

我怎样才能只在一个过程中运行它来避免比赛条件?

这是输出:

Cleaning Up..
┌───────────────────────────────────────────────────┐  ┌───────────────────────────────────────────────────┐
│                   Fiber v2.38.1                   │  │ Child PIDs ... 79378, 79379, 79380, 79381         │
│               http://127.0.0.1:4000               │  └───────────────────────────────────────────────────┘
│       (bound on host 0.0.0.0 and port 4000)       │ 
│                                                   │ 
│ Handlers ............. 5  Processes ........... 4 │ 
│ Prefork ........ Enabled  PID ............. 79377 │ 
└───────────────────────────────────────────────────┘ 
Cleaning Up..
Cleaning Up..
Cleaning Up..
Cleaning Up..

Fiber产生了几个处理传入请求的进程。您需要的是在主进程中启动清理例程,并在子进程中跳过它。

光纤提供fiber.IsChild功能:

// start a cleanup cron-job
if !fiber.IsChild() {
go cleanUp()
}

我稍微修改了您的示例,在处理程序和清理goroutine:中打印进程ID

func main() {
// 4 procs/childs max
runtime.GOMAXPROCS(4)
// start a cleanup cron-job
if !fiber.IsChild() {
go cleanUp()
}
app := fiber.New(fiber.Config{
Prefork: true,
})
app.Post("/", handleFileupload)
log.Fatal(app.Listen(":4000"))
}
func cleanUp() {
fmt.Println("Cleaning Up.. Pid:", syscall.Getpid())
for {
// deletes old files here
time.Sleep(1 * time.Second)
fmt.Println("Cleaning Up.. Pid:", syscall.Getpid())
}
}
func handleFileupload(ctx *fiber.Ctx) error {
println("Upload: pid ", syscall.Getpid())
return nil
}

结果:

Cleaning Up.. Pid: 27035
┌───────────────────────────────────────────────────┐  ┌───────────────────────────────────────────────────┐
│                   Fiber v2.39.0                   │  │ Child PIDs ... 27041, 27042, 27044, 27045         │
│               http://127.0.0.1:4000               │  └───────────────────────────────────────────────────┘
│       (bound on host 0.0.0.0 and port 4000)       │ 
│                                                   │ 
│ Handlers ............. 1  Processes ........... 4 │ 
│ Prefork ........ Enabled  PID ............. 27035 │ 
└───────────────────────────────────────────────────┘ 
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035
Cleaning Up.. Pid: 27035

如您所见,清理仅在主进程中运行。

最新更新