亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在單個 gofiber 進程中運行后臺任務

在單個 gofiber 進程中運行后臺任務

Go
蝴蝶刀刀 2023-03-07 13:55:05
我有一個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)    }}目前cleanUp在所有 4 個進程上運行并打印Cleaning Up..4 次。但我希望它只在單個進程上運行并打印單個Cleaning Up... 我已經嘗試過 waitGroups 和 channels 但未能實現我想要的。我怎樣才能只在單個進程上運行它以避免競爭條件?這是輸出: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..
查看完整描述

1 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

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

如您所見,清理僅在主進程中運行。


查看完整回答
反對 回復 2023-03-07
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號