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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法并行化時間。睡眠但保持圍棋的有效執(zhí)行時間?

有沒有辦法并行化時間。睡眠但保持圍棋的有效執(zhí)行時間?

Go
www說 2022-08-24 12:50:13
我正在開發(fā)一個慢速查詢?nèi)罩窘馕銎靼摪cgolang中的慢速查詢?nèi)罩局胤牌飨嚓P(guān)聯(lián)。對于重修器,請?zhí)峁┮韵麓a段(為了便于閱讀,我在其中添加了注釋):for {        // method from my package that returns a Query object, containing headers values        // and the query itself        q := p.GetNext()        if q == (query.Query{}) {            break        }        db.logger.Tracef("query: %s", q.Query)        // we send the SQL query to a chan that is read by workers.        // workers just execute the query on the database, that's all.        // results from the db query are handled in another piece of the code, it doesn't really        // matter here        queries <- q.Query        // We need a reference time        if firstPass {            firstPass = false            previousDate = q.Time            continue        }                // Time field contains the Time: field value in the query header        now := q.Time        sleeping := now.Sub(previousDate)        db.logger.Tracef("next sleeping time: %s", sleeping)        time.Sleep(sleeping) // Here is my issue. For MariaDB the value is < 0 so no sleep is done        // For MariaDB, when there is multiple queries in a short amount of        // time, the Time field is not repeated, so we do not have to update        // the previous date.        if now != (time.Time{}) {            previousDate = now        }    }我遇到了一個有趣的問題:在MariaDB慢速查詢?nèi)罩局校绻?個(或更多)查詢彼此接近,則標(biāo)頭中沒有Time:字段,這減少了上一個代碼片段中的數(shù)量。但是,對于MySQL風(fēng)格的慢速查詢?nèi)罩荆樵儤?biāo)頭中始終存在Time:字段,這意味著每個查詢的睡眠都已完成(即使對于μs睡眠持續(xù)時間)。time.Sleep(sleeping)我注意到MariaDB和MySQL日志之間存在巨大的重播時間差;MariaDB重放持續(xù)時間與實時時間非常相似(日志文件的第一個和最后一個查詢之間的時間差),但另一方面,MySQL重放時間比IRL高得多。玩后,我注意到問題來自,特別是從中耗費了CPU時間。pproftime.Sleepruntime.Futex我做了一些基準測試,持續(xù)時間結(jié)果與完成的數(shù)量相關(guān)(MySQL比MariaDB高)。time.Sleep因此,我不是在單個線程中完成所有操作,而是尋找一種不同的方法來并行執(zhí)行它們而不改變有效時間,但我無法找到一種方法來做到這一點。time.Sleep
查看完整描述

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í)行查詢,否則他將等待。


查看完整回答
反對 回復(fù) 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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