1 回答

TA貢獻1802條經(jīng)驗 獲得超10個贊
我提出的解決方案如下:
type job struct {
query string
idle time.Time
}
...
var reference time.Time
start := time.Now()
for {
q := p.GetNext()
if q == (query.Query{}) {
s.Stop()
break
}
db.logger.Tracef("query: %s", q.Query)
r.queries++
s.Suffix = " queries replayed: " + strconv.Itoa(r.queries)
// We need a reference time
if firstPass {
firstPass = false
reference = q.Time
}
var j job
delta := q.Time.Sub(reference)
j.idle = start.Add(delta)
j.query = q.Query
db.logger.Tracef("next sleeping time: %s", j.idle)
jobs <- j
}
...
func (db database) worker(jobs chan job, errors chan error, wg *sync.WaitGroup) {
defer wg.Done()
for {
j, ok := <-jobs
if !ok {
db.logger.Trace("channel closed, worker exiting")
return
}
sleep := time.Until(j.idle)
if sleep > 0 {
time.Sleep(sleep)
}
rows, err := db.drv.Query(j.query)
if err != nil {
errors <- err
db.logger.Debugf("failed to execute query:\n%s\nerror: %s", j.query, err)
}
if rows != nil {
rows.Close()
}
}
}
解釋:
我們將程序的開頭保存在一個變量中(此處 )。接下來,我們設(shè)置一個引用時間(in ),這是慢速查詢?nèi)罩疚募牡谝粋€時間戳。它永遠不會改變。startreference
然后,在每個新查詢中,我們計算 與當(dāng)前查詢時間戳 之間的持續(xù)時間。讓我們將其存儲在 .referenceq.Timedelta
我們添加到時間線中,并且有一個時間戳(而不是像過去那樣在慢速查詢?nèi)罩疚募校?。我們將此時間戳發(fā)送到我們創(chuàng)建的新結(jié)構(gòu)中查詢旁邊的工作線程,該結(jié)構(gòu)名為 。deltastartjob
當(dāng)工作人員通過通道收到作業(yè)時,他會計算等待的時間,直到他可以執(zhí)行查詢。如果它<= 0,它將立即執(zhí)行查詢,否則他將等待。
- 1 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報