gpt4 book ai didi

Goroutine 在 Windows 和 Linux 上的行为不同

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:40 25 4
gpt4 key购买 nike

我是 GO 的新手。我有以下遗留代码。

var db *sql.DB

func init() {
go feedChan()

connString := os.Getenv("DB_CONN")
var err error

db, err = sql.Open("postgres", connString)
if err != nil {
log.Fatalf("Failed to connect to database at %q: %q\n", connString, err)
}

// confirm connection
if err = db.Ping(); err != nil {
log.Fatalf("Unable to ping database at %q: %q\n", connString, err)
}
}


func feedChan() {
selectQuery, err := db.Prepare(`
SELECT id, proxy
FROM proxy
WHERE fail_count < 2
ORDER BY date_added DESC, last_used ASC, fail_count ASC
LIMIT 5
`)
....

以下代码适用于 linux。但它在 Windows 上失败,出现 nil 错误

selectQuery, err := db.Prepare(`

这对我来说很有意义,因为 db 在 feedChan goroutine 启动后初始化。对我来说没有意义的是为什么它可以在 Linux 上运行。

那么问题是为什么这段代码可以在 linux 上正常运行?

最佳答案

那可能是一个 race condition .导入 "time",将此行放在 go feedChan() 之后,看看它是否仍然适用于 Linux:

time.Sleep(3 * time.Second)

为了避免这种情况,您可以在生成例程(使用 db)之前初始化 db 或使用某种的 barrier :

func init() {
barrier := make(chan int)
go feedChan(barrier)

connString := os.Getenv("DB_CONN")
var err error
db, err = sql.Open("postgres", connString)

if err != nil {
log.Fatalf("Failed to connect to database at %q: %q\n", connString, err)
// Retry.
} else {
barrier <- 1 // Opens barrier.
}
// ...
}


func feedChan(barrier chan int) {
<-barrier // Blocks until db is ready.
selectQuery, err := db.Prepare(`
SELECT id, proxy
FROM proxy
WHERE fail_count < 2
ORDER BY date_added DESC, last_used ASC, fail_count ASC
LIMIT 5
`)
// ...
}

关于Goroutine 在 Windows 和 Linux 上的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39945856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com