使用Go,我想每隔1秒從連接到串行埠的設備中讀取一次,該設備每隔300毫秒發送一次以換行符為終點的日志。我認為,這是通過串行埠進行的,這一點并不重要。既然設備每隔300毫秒就寫一次日志條目,我怎么能每隔1秒就讀一次新的日志條目,并丟棄其他條目呢?
uj5u.com熱心網友回復:
記住上次處理日志條目的時間。 在一個回圈中讀取日志條目。 如果自日志以來的時間大于所需的頻率,則處理日志并更新最后的日志時間。
freq := time.Second
prev := time.Time{}
for {
log := readLog()
if time.Since(prev) > freq {
prev = time.Now()
//對log做一些處理。
}
}
uj5u.com熱心網友回復:
你可以使用Go通道來速率限制和節流 - 如果你想放棄事件,一個帶有select的緩沖通道與case default:相結合,可以實作非阻塞通道寫入。
因此,一個簡單的輪詢實作(類似于@BurakSerdar的建議--但是在讀取一個訊息之前,訊息會被丟棄--但是會產生相同的結果):
ch := make(chan string, 1) //1 - 所以我們至少保留一條資訊。
go func() {
for {
msg := getLog()
//非阻塞性寫入,即訊息可能被丟棄。
select {
case ch <- msg:
default:
}
}
}()
和閱讀:
for msg := range ch {
Info.Printf(" throttled: %s", msg)
time.Sleep(1000 * time.Millisecond) //節流1條資訊/s
作業實體:
https://play.golang.org/p/_QIBGal4_jJ
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313752.html
標籤:
上一篇:OWASP依賴檢查,如何使用抑制
