第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

繼續(xù)在 Golang 中重試函數(shù)

繼續(xù)在 Golang 中重試函數(shù)

Go
茅侃侃 2022-08-24 16:18:34
我正在嘗試創(chuàng)建一個(gè)功能,該功能將按以下方式工作:調(diào)用服務(wù)函數(shù)后,它使用 Fetch 函數(shù)從服務(wù)(以字節(jié)數(shù)組的形式出現(xiàn))獲取記錄,JSON 取消元帥字節(jié)數(shù)組,填充結(jié)構(gòu),然后將結(jié)構(gòu)發(fā)送到數(shù)據(jù)庫(kù)函數(shù)以保存到數(shù)據(jù)庫(kù)?,F(xiàn)在,由于這需要是一個(gè)連續(xù)的作業(yè),因此我添加了兩個(gè) if 條件,如果收到的記錄長(zhǎng)度為 0,則我們使用重試函數(shù)重試?yán)∮涗?,否則我們只需寫(xiě)入數(shù)據(jù)庫(kù)。我一直在嘗試調(diào)試重試函數(shù)一段時(shí)間,但它只是不起作用,并且在第一次重試后基本上停止了(即使我將嘗試指定為100)。我能做些什么來(lái)確保,它不斷重試?yán)瓌?dòng)記錄?代碼如下:// RETRY FUNCTIONfunc retry(attempts int, sleep time.Duration, f func() error) (err error) {for i := 0; ; i++ {    err = f()    if err == nil {        return    }    if i >= (attempts - 1) {        break    }    time.Sleep(sleep)    sleep *= 2    log.Println("retrying after error:", err)}return fmt.Errorf("after %d attempts, last error: %s", attempts, err) }//Save Data function type Records struct {Messages [][]byte}func (s *Service) SaveData(records Records, lastSentPlace uint) error {//lastSentPlace is sent as 0 to begin with.for i := lastSentPlace; i <= records.Place-1; i++ {    var msg Records    msg.Unmarshal(records.Messages[i])    order := MyStruct{        Fruit:    msg.Fruit,        Burger:   msg.Burger,        Fries:    msg.Fries,     }    err := s.db.UpdateOrder(context.TODO(), nil , order)    if err != nil {        logging.Error("Error occured...")    }    }return nil}//Service function (This runs as a batch, which is why we need retrying)func (s *Service) MyServiceFunction(ctx context.Context, place uint, length uint) (err error) {var lastSentPlace = placerecords, err := s.Poll(context.Background(), place, length)if err != nil {    logging.Info(err)}我認(rèn)為,問(wèn)題在于我嘗試實(shí)現(xiàn)重試函數(shù)的方式,我已經(jīng)嘗試調(diào)試了一段時(shí)間,但是作為該語(yǔ)言的新手,我真的卡住了。我想做的是,如果沒(méi)有找到任何記錄,就實(shí)現(xiàn)回退。任何幫助都非常感謝。
查看完整描述

4 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

我進(jìn)行更簡(jiǎn)單的重試。

  • 使用更簡(jiǎn)單的循環(huán)邏輯來(lái)確保正確性。

  • 我們?cè)趫?zhí)行重試之前會(huì)睡覺(jué),因此請(qǐng)用作睡眠的條件。i > 0

代碼如下:

func retry(attempts int, sleep time.Duration, f func() error) (err error) {

    for i := 0; i < attempts; i++ {

        if i > 0 {

            log.Println("retrying after error:", err)

            time.Sleep(sleep)

            sleep *= 2

        }

        err = f()

        if err == nil {

            return nil

        }

    }

    return fmt.Errorf("after %d attempts, last error: %s", attempts, err)

}


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

我知道這是一個(gè)古老的問(wèn)題,但在搜索重試時(shí)遇到了它,并將其用作解決方案的基礎(chǔ)。


此版本可以接受具有 2 個(gè)返回值的函數(shù),并在 golang 1.18 中使用泛型來(lái)實(shí)現(xiàn)這一點(diǎn)。我在1.17中嘗試過(guò),但無(wú)法找到使該方法通用的方法。


這可以擴(kuò)展到任何類(lèi)型的任意數(shù)量的返回值。我在這里使用過(guò),但可以限制為類(lèi)型列表。any


func retry[T any](attempts int, sleep int, f func() (T, error)) (result T, err error) {

    for i := 0; i < attempts; i++ {

        if i > 0 {

            log.Println("retrying after error:", err)

            time.Sleep(time.Duration(sleep) * time.Second)

            sleep *= 2

        }

        result, err = f()

        if err == nil {

            return result, nil

        }

    }

    return result, fmt.Errorf("after %d attempts, last error: %s", attempts, err)

}

用法示例:


var config Configuration


something, err := retry(config.RetryAttempts, config.RetrySleep, func() (Something, error) { return GetSomething(config.Parameter) })


func GetSomething(parameter string) (something Something, err error) {

    // Do something flakey here that might need a retry...

    return something, error

}

希望這能幫助與我具有相同用例的人。


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

您正在調(diào)用的函數(shù)正在使用上下文。因此,處理該上下文非常重要。


如果您不知道上下文是什么以及如何使用它,我會(huì)推薦該帖子:https://blog.golang.org/context


重試函數(shù)還應(yīng)處理上下文。只是為了讓你走上正軌,我給你一個(gè)簡(jiǎn)單的實(shí)現(xiàn)。


func retryMyServiceFunction(ctx context.Context, place uint, length uint, sleep time.Duration) {

    for {

        select {

        case ctx.Done():

            return

        default:

            err := MyServiceFunction(ctx, place, length)

            if err != nil {

                log.Println("handle error here!", err)

                time.Sleep(sleep)

            } else {

                return

            }

        }

    }

}

我不喜歡睡眠部分。因此,您應(yīng)該分析返回的錯(cuò)誤。此外,您還必須考慮超時(shí)。當(dāng)您讓服務(wù)長(zhǎng)時(shí)間休眠時(shí),可能會(huì)有超時(shí)。


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

在GoPlayground中接受的答案的評(píng)論中,我會(huì)考慮添加一些東西。在 for 循環(huán)中使用 continue 和 break 會(huì)使循環(huán)更加簡(jiǎn)單,因?yàn)椴皇褂迷撜Z(yǔ)句。此外,我會(huì)在所有函數(shù)中使用早期返回來(lái)直接返回錯(cuò)誤。最后,我會(huì)一直使用錯(cuò)誤來(lái)檢查函數(shù)是否失敗,檢查值的有效性應(yīng)該在執(zhí)行的函數(shù)本身內(nèi)部。if i > 0 {


這將是我的小嘗試:


package main


import (

    "errors"

    "fmt"

    "log"

    "time"

)


func main() {

    var complicatedFunctionPassing bool = false

    var attempts int = 5


    // if complicatedFunctionPassing is true retry just makes one try

    // if complicatedFunctionPassing is false retry makes ... attempts

    err := retry(attempts, time.Second, func() (err error) {

        if !complicatedFunctionPassing {

            return errors.New("somthing went wrong in the important function")

        }

        log.Println("Complicated function passed")

        return nil

    })

    if err != nil {

        log.Printf("failed after %d attempts with error: %s", attempts, err.Error())

    }

}


func retry(attempts int, sleep time.Duration, f func() error) (err error) {

    for i := 0; i < attempts; i++ {

        fmt.Println("This is attempt number", i+1)

        // calling the important function

        err = f()

        if err != nil {

            log.Printf("error occured after attempt number %d: %s", i+1, err.Error())

            log.Println("sleeping for: ", sleep.String())

            time.Sleep(sleep)

            sleep *= 2

            continue

        }

        break

    }

    return err

}

你可以在這里嘗試一下:https://go.dev/play/p/Ag8ObCb980U


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 4 回答
  • 0 關(guān)注
  • 161 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)