1 回答
TA貢獻1818條經驗 獲得超7個贊
這里有一個根本性的誤解。線程只能執行兩項操作:
線程可以阻塞,等待某些東西。
線程可以使用 CPU 運行。
如果線程從不阻塞,則它使用 100% 的可用 CPU。不能使非阻塞代碼使用的 CPU 少于 100%。
您有三種選擇:
使用非阻塞代碼,并接受 100% 的 CPU 使用率。
重新設計,使其使用通道,并且可以放在塊內。checkSomthingIsTrue()select
for {
select {
case <-ctx.Done():
return true
case <-whenSomethingIsTrue():
if err := doSomthing(); err != nil {
continue
}
}
}
使用超時來限制循環,例如:
// Poll every 100ms.
const pollInterval = 100 * time.Millisecond
for {
select {
case <-ctx.Done():
return true
case <-time.After(pollInterval):
if checkSomthingIsTrue() {
if err := doSomthing(); err != nil {
continue
}
}
}
}
另請注意,這毫無意義,但這是一個不同的問題。continue
- 1 回答
- 0 關注
- 94 瀏覽
添加回答
舉報
