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

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

為什么我在main中使用goroutine時(shí)我的程序沒有關(guān)閉?

為什么我在main中使用goroutine時(shí)我的程序沒有關(guān)閉?

Go
GCT1015 2023-01-03 17:17:07
語境請(qǐng)仔細(xì)閱讀代碼中的注釋。一切都在他們身上。如果您有使用經(jīng)驗(yàn)discordgo完整的代碼可以在這里找到:https ://github.com/telephrag/kubinka/tree/bug (查看包strg和main)添加 goroutine 命令處理程序也會(huì)停止正常工作。與數(shù)據(jù)庫交互相關(guān)的所有內(nèi)容(分別在 /deploy 和 /return 上存儲(chǔ)和從數(shù)據(jù)庫中刪除)根本不起作用。用戶只會(huì)收到“應(yīng)用程序未響應(yīng)”消息而不是正確的響應(yīng)(請(qǐng)參閱以cmd_前綴開頭的包)。package mainimport (    "context"    "fmt"    "log"    "os"    "os/signal"    "syscall"    "time"    "go.etcd.io/bbolt")/*  TO REPRODUCE:Start the program wait a few seconds and press ^C.Expect the case of program not shutting down after few attempts.*/func WatchExpirations(ctx context.Context, db *bbolt.DB, bkt string) error {    timeout := time.After(time.Second * 5)    for {        select {        case <-timeout:            tx, err := db.Begin(true)            if err != nil {                return fmt.Errorf("bolt: failed to start transaction")            }            bkt := tx.Bucket([]byte(bkt))            c := bkt.Cursor()            for k, v := c.First(); k != nil; k, v = c.Next() {                // do stuff with bucket...                fmt.Println(v) // check if v matches condition, delete if does                if err := tx.Commit(); err != nil { // BUG: commiting transaction in a loop                    tx.Rollback()                    return fmt.Errorf("bolt: failed to commit transaction: %w", err)                }                timeout = time.After(time.Second * 5)            }        case <-ctx.Done():            return ctx.Err()        }    }}func main() {    ctx, cancel := context.WithCancel(context.Background())    db, err := bbolt.Open("kubinka.db", 0666, nil)    if err != nil {        log.Panicf("failed to open db %s: %v", "kubinka.db", err)    }    if err = db.Update(func(tx *bbolt.Tx) error {        _, err := tx.CreateBucketIfNotExists([]byte("players"))        if err != nil {            return fmt.Errorf("failed to create bucket %s: %w", "players", err)        }        return nil    }); err != nil {        log.Panic(err)    }
查看完整描述

1 回答

?
慕仙森

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

根據(jù)您的回購協(xié)議中的評(píng)論,問題似乎出在這里:

tx, err := db.Begin(true)

if err != nil {

   return fmt.Errorf("bolt: failed to start transaction")

}

bkt := tx.Bucket([]byte(bkt))

c := bkt.Cursor()

for k, v := c.First(); k != nil; k, v = c.Next() {

    // do stuff with bucket...

    fmt.Println(v) // check if v matches condition, delete if does


    if err := tx.Commit(); err != nil { // BUG: commiting transaction in a loop

        tx.Rollback()

        return fmt.Errorf("bolt: failed to commit transaction: %w", err)

    }

    timeout = time.After(time.Second * 5)

}

循環(huán)可以迭代 0 次。

  • 如果沒有迭代 -tx不提交timeout也不重置(因此case <-timeout:不會(huì)再次觸發(fā))。

  • 如果有多次迭代 - 您將嘗試tx.Commit()多次(錯(cuò)誤)。

這可能導(dǎo)致了您看到的問題;bolt Close功能:_

關(guān)閉釋放所有數(shù)據(jù)庫資源。在關(guān)閉數(shù)據(jù)庫之前必須關(guān)閉所有事務(wù)。

因此,如果有一個(gè)事務(wù)運(yùn)行Close塊直到完成(內(nèi)部螺栓在事務(wù)開始時(shí)鎖定互斥鎖并在完成時(shí)釋放它)。

解決方案是確保事務(wù)始終關(guān)閉(并且只關(guān)閉一次)。



查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 1 回答
  • 0 關(guān)注
  • 109 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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