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

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

如果已經運行,則不應執行 Ticker

如果已經運行,則不應執行 Ticker

Go
翻過高山走不出你 2022-05-18 13:49:58
我有一些必須定期運行的功能。我為此使用了自動收報機。但是如果代碼已經在運行,并且時間間隔再次過去,它不應該再次執行。package mainimport (    "fmt"    "time")func main() {    ticker := time.NewTicker(3*time.Second)    flag := 0    defer ticker.Stop()    for {        select {        case t := <-ticker.C:            flag = flag + 1            if (flag % 2 ==0 ) {                time.Sleep(time.Second*4)            }               fmt.Println("Current time: ", t)        }    }}https://play.golang.org/p/2xV2MYInn4I在操場上,自動收報機每 3 秒打印一次,但每次自動收報機的偶數轉一圈,作業所花費的時間都比間隔時間長。我希望它不會運行并放棄那些滴答聲。我該怎么做呢?
查看完整描述

2 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

睡在同一個 goroutine 中只會延遲執行。同時,ticker 在一個單獨的 goroutine 中運行。因此,即使您使用全局變量來維持執行狀態 - 它也不會為您提供所需的睡眠結果。然而,在一個單獨的 goroutine 中遷移整個“睡眠”會產生:


package main


import (

    "fmt"

    "time"

)


type Tick struct {

    ticker *time.Ticker

    executing bool

}


func somethingYouWantToDo(tick *Tick, flag *int, t time.Time) {

    if tick.executing {

        return

    }


    tick.executing = true


    *flag = *flag + 1


    if (*flag % 2 ==0 ) {

                time.Sleep(time.Second*4)

    }   

        fmt.Println("Current time: ", t)

    tick.executing = false

}


func main() {

    tick := &Tick{

        ticker: time.NewTicker(3*time.Second),

    }

    flag := 0

    defer tick.ticker.Stop()

    for {

        select {

        case t := <-tick.ticker.C:

            go somethingYouWantToDo(tick, &flag, t)

        }

    }

}

// output

// Current time:  2009-11-10 23:00:03 +0000 UTC m=+3.000000001

// Current time:  2009-11-10 23:00:06 +0000 UTC m=+6.000000001

// Current time:  2009-11-10 23:00:12 +0000 UTC m=+12.000000001

// Current time:  2009-11-10 23:00:15 +0000 UTC m=+15.000000001

// Current time:  2009-11-10 23:00:21 +0000 UTC m=+21.000000001

// Current time:  2009-11-10 23:00:24 +0000 UTC m=+24.000000001

// Current time:  2009-11-10 23:00:30 +0000 UTC m=+30.000000001

// Current time:  2009-11-10 23:00:33 +0000 UTC m=+33.000000001

// Current time:  2009-11-10 23:00:39 +0000 UTC m=+39.000000001

// Current time:  2009-11-10 23:00:42 +0000 UTC m=+42.000000001

// Current time:  2009-11-10 23:00:48 +0000 UTC m=+48.000000001

// Current time:  2009-11-10 23:00:51 +0000 UTC m=+51.000000001

// Current time:  2009-11-10 23:00:57 +0000 UTC m=+57.000000001

// Current time:  2009-11-10 23:01:00 +0000 UTC m=+60.000000001

// Current time:  2009-11-10 23:01:06 +0000 UTC m=+66.000000001

// Current time:  2009-11-10 23:01:09 +0000 UTC m=+69.000000001


查看完整回答
反對 回復 2022-05-18
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

代碼通道是緩沖的,這就是為什么您可能會一個接一個地看到多個觸發器。您可以通過簡單地將代碼的值傳輸到無緩沖通道來防止這種情況(另請注意,從代碼接收的 time.Time 值不是當前時間,而是最后一次滴答的時間):


package main


import (

    "fmt"

    "time"

)


func main() {

    c := make(chan time.Time) // unbuffered

    ticker := time.NewTicker(3 * time.Second)

    defer ticker.Stop()


    go func() {

        for t := range ticker.C {

            select {

            case c <- t:

            default:

            }

        }

    }()


    for flag := 0; flag < 8; flag++ {

        <-c


        if flag%2 == 0 {

            time.Sleep(time.Second * 4)

        }

        fmt.Println("Current time: ", time.Now())

    }

}


// Output:

// Current time:  2020-02-19 12:21:57.095433032 +0100 CET m=+3.000213350

// Current time:  2020-02-19 12:22:04.095585208 +0100 CET m=+10.000365520

// Current time:  2020-02-19 12:22:06.095363327 +0100 CET m=+12.000143680

// Current time:  2020-02-19 12:22:13.095605268 +0100 CET m=+19.000385598

// Current time:  2020-02-19 12:22:15.095371885 +0100 CET m=+21.000152174

// Current time:  2020-02-19 12:22:22.095537562 +0100 CET m=+28.000317857

// Current time:  2020-02-19 12:22:24.095431317 +0100 CET m=+30.000211625

// Current time:  2020-02-19 12:22:31.095524308 +0100 CET m=+37.000304595

在操場上試一試:https: //play.golang.org/p/jDe5uJiRVe2


查看完整回答
反對 回復 2022-05-18
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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