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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

后臺(tái)打印程序概念/API 和通道:將作業(yè)從 serveHTTP 傳遞到隊(duì)列

后臺(tái)打印程序概念/API 和通道:將作業(yè)從 serveHTTP 傳遞到隊(duì)列

Go
慕妹3146593 2023-06-19 17:38:31
在這里已經(jīng)得到了一些幫助,這讓我在我正在嘗試的這個(gè)概念上取得了進(jìn)展,但它仍然不太奏效,我遇到了一個(gè)我似乎無(wú)法解決的沖突。我在這里嘗試在流程圖中說(shuō)明我想要的內(nèi)容 - 請(qǐng)注意,客戶端可以是許多將發(fā)送 printjobs 的客戶端,因此我們無(wú)法回復(fù)工作人員當(dāng)時(shí)正在處理我們的工作,但對(duì)于大多數(shù)情況而言(高峰時(shí)間不會(huì),因?yàn)榇蛴〉奶幚砉ぷ骺赡苄枰獣r(shí)間)。type QueueElement struct {    jobid string    rw   http.ResponseWriter  doneChan chan struct{}}type GlobalVars struct {    db   *sql.DB    wg   sync.WaitGroup    jobs chan QueueElement}func (gv *GlobalVars) ServeHTTP(w http.ResponseWriter, r *http.Request) {    switch r.URL.Path {    case "/StartJob":        fmt.Printf ("incoming\r\n")            doneC := make(chan struct{}, 1) //Buffered channel in order not to block the worker routine            newPrintJob := QueueElement{                    doneChan: doneC,                        jobid:    "jobid",            }上面的代碼是 serveHTTP 和 worker 的幫助,最初 ServeHTTP 中的 func 是一個(gè) go 例程,在這里對(duì)我來(lái)說(shuō)整個(gè)沖突都出現(xiàn)了 - 這個(gè)概念是在 serveHTTP 中它產(chǎn)生一個(gè)將得到回復(fù)的進(jìn)程如果工人能夠在 5 秒內(nèi)及時(shí)處理作業(yè),則從工人處獲得。如果工作能夠在 1 秒內(nèi)完成,我想在 1 秒后立即回復(fù)客戶,如果需要 3 秒,我想在 3 秒后回復(fù),如果超過(guò) 5 秒,我會(huì)在 5 秒后回復(fù)(如果工作需要 13 秒,我仍然想在 5 秒后回復(fù))。從現(xiàn)在開始,客戶必須對(duì)工作進(jìn)行輪詢——但沖突是:a) 當(dāng) ServeHTTP 退出時(shí) - 然后 ResponseWriter 關(guān)閉 - 為了能夠回復(fù)客戶端,我們必須將答案寫入 ResponseWriter。b) 如果我阻止 serveHTTP(就像在下面的代碼示例中,我沒(méi)有將 func 稱為 go 例程)那么它不僅會(huì)影響單個(gè) API 調(diào)用,而且似乎會(huì)影響之后的所有其他調(diào)用,所以第一個(gè)呼叫將被及時(shí)正確地服務(wù),但是在第一個(gè)呼叫之后同時(shí)進(jìn)入的呼叫將被阻塞操作順序延遲。c) 如果我不阻止它 ex - 并將其更改為 go 例程:    gv.jobs <- newPrintJob    go func(doneChan chan struct{},w http.ResponseWriter) {然后沒(méi)有延遲 - 可以調(diào)用許多 API - 但問(wèn)題是 serveHTTP 立即存在并因此殺死 ResponseWriter 然后我無(wú)法回復(fù)客戶端。我不確定如何解決這個(gè)沖突,因?yàn)槲也粫?huì)對(duì) serveHTTP 造成任何阻塞,所以我可以并行處理所有請(qǐng)求,但仍然能夠回復(fù)有問(wèn)題的 ResponseWriter。有什么方法可以防止 serveHTTP 在函數(shù)退出時(shí)關(guān)閉響應(yīng)編寫器?
查看完整描述

3 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

是的,如果我不阻止它,你的觀點(diǎn)“c) 是正確的” 。

為了保存響應(yīng)編寫器,您不應(yīng)該在其中調(diào)用 go routine。相反,您應(yīng)該將ServeHTTP作為 go-routine 調(diào)用,大多數(shù) http 服務(wù)器實(shí)現(xiàn)都這樣做。
這樣你就不會(huì)阻止任何 api 調(diào)用,每個(gè) api 調(diào)用將在不同的 go-routine 中運(yùn)行,被它們的功能阻止。

由于您的“jobs chan QueueElement”是單個(gè)通道(不是緩沖通道),因此您的所有進(jìn)程都在“gv.jobs <- newPrintJob”處被阻塞。
您應(yīng)該使用緩沖通道,以便所有 api 調(diào)用都可以將其添加到隊(duì)列中并根據(jù)工作完成或超時(shí)獲得響應(yīng)。

擁有緩沖通道也可以模擬打印機(jī)在現(xiàn)實(shí)世界中的內(nèi)存限制。(隊(duì)列長(zhǎng)度 1 是特例)


查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊

我已經(jīng)為您的代碼添加了一些更新?,F(xiàn)在它像你描述的那樣工作。


package main


import (

    "database/sql"

    "fmt"

    "log"

    "math/rand"

    "net/http"

    "sync"

    "time"

)


type QueueElement struct {

    jobid    string

    rw       http.ResponseWriter

    doneChan chan struct{}

}


type GlobalVars struct {

    db   *sql.DB

    wg   sync.WaitGroup

    jobs chan QueueElement

}


func (gv *GlobalVars) ServeHTTP(w http.ResponseWriter, r *http.Request) {


    switch r.URL.Path {

    case "/StartJob":

        fmt.Printf("incoming\r\n")


        doneC := make(chan struct{}, 1) //Buffered channel in order not to block the worker routine


        go func(doneChan chan struct{}, w http.ResponseWriter) {

            gv.jobs <- QueueElement{

                doneChan: doneC,

                jobid:    "jobid",

            }

        }(doneC, w)


        select {

        case <-time.Tick(time.Second * 5):

            fmt.Fprintf(w, "job is taking more than 5 seconds to complete\r\n")

            fmt.Printf("took longer than 5 secs\r\n")

        case <-doneC:

            fmt.Fprintf(w, "instant reply from serveHTTP\r\n")

            fmt.Printf("instant\r\n")

        }

    default:

        fmt.Fprintf(w, "No such Api")

    }

}


func worker(jobs <-chan QueueElement) {

    for {

        job := <-jobs

        fmt.Println("START /i /b try.cmd")

        fmt.Printf("job done")


        randTimeDuration := time.Second * time.Duration(rand.Intn(7))


        time.Sleep(randTimeDuration)


        //  processExec("START /i /b processAndPrint.exe -" + job.jobid)

        job.doneChan <- struct{}{}

    }

}


func main() {


    // create a GlobalVars instance

    gv := GlobalVars{

        //db:   db,

        jobs: make(chan QueueElement),

    }

    go worker(gv.jobs)

    // create an http.Server instance and specify our job manager as

    // the handler for requests.

    server := http.Server{

        Handler: &gv,

        Addr:    ":8888",

    }

    // start server and accept connections.

    log.Fatal(server.ListenAndServe())

}



查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

select語(yǔ)句應(yīng)該在 goroutine 函數(shù)之外并阻止請(qǐng)求直到作業(yè)執(zhí)行結(jié)束或達(dá)到超時(shí)。



查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 3 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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