Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk menetapkan tamat masa untuk pengimbas bufio yang mengimbas dalam gelung?

Bagaimana untuk menetapkan tamat masa untuk pengimbas bufio yang mengimbas dalam gelung?

WBOY
Lepaskan: 2024-02-06 08:05:07
ke hadapan
1114 orang telah melayarinya

Bagaimana untuk menetapkan tamat masa untuk pengimbas bufio yang mengimbas dalam gelung?

Kandungan soalan

Saya menggunakan golang untuk memulakan proses dan memantau output. Proses ini akan berjalan untuk masa yang lama dan saya perlu dapat menghantar isyarat untuk menamatkannya.

Saya mempunyai kod berikut yang berfungsi dengan baik dalam kebanyakan kes. Tetapi atas sebab tertentu, proses mungkin tidak mempunyai output dan gelung for akan mendapat mesej scan()方法阻塞,无法接收来自processfinishchan.

Adakah cara mudah untuk menyekat untuk scan() 方法设置超时?我尝试了一个解决方案,在另一个 goroutine 中运行 scan() ,并使用另一个 select 从新的 goroutine 和超时通道接收,但考虑到外部 for 循环,是否会有越来越多的 goroutine 被 scan? p>

// code that start the process...
scanner := bufio.NewScanner(stdout)

for {
    select {
    case <-processFinishChan: // send to this channel to terminate the process
        log.Println("Killing Process")
        err := cmdObject.Process.Kill()
        if err != nil {
            log.Printf("Error Killing: %v", err)
        } else {
            return
        }
    default:
        // default case, read the output of process and send to user.
        if !scanner.Scan() && scanner.Err() == nil {
            // reach EOF
            return
        }
        m := scanner.Bytes()

        WSOutChanHolder.mu.Lock()
        for _, ch := range WSOutChanHolder.data {
            ch <- m
        }
        WSOutChanHolder.mu.Unlock()
    }
}
Salin selepas log masuk


Jawapan betul


Andaikan keputusan stdoutcmdobject.stdoutpipe() , maka pembaca hendaklah menutup pembaca dan mengganggu mana-mana bacaan yang sedang berjalan sementara menunggu selepas proses keluar.

tunggu akan menutup paip selepas melihat arahan keluar, jadi kebanyakan pemanggil tidak perlu menutup paip itu sendiri.

Jadi, kita perlu mematikan proses dalam goroutine yang berasingan dan kemudian selepas membunuh proses tunggu lihat ia berlaku dan tutup pembaca.

// code that start the process...
scanner := bufio.NewScanner(stdout)

go func() {
    <-processFinishChan: // send to this channel to terminate the process
    log.Println("Killing Process")
    err := cmdObject.Process.Kill()
    if err != nil {
        log.Printf("Error Killing: %v", err)
    } 

    cmdObject.Wait()
} ()

for {
    // default case, read the output of process and send to user.
    if !scanner.Scan() && scanner.Err() == nil {
        // reach EOF
        return
    }
    m := scanner.Bytes()

    WSOutChanHolder.mu.Lock()
    for _, ch := range WSOutChanHolder.data {
        ch <- m
    }
    WSOutChanHolder.mu.Unlock()
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk menetapkan tamat masa untuk pengimbas bufio yang mengimbas dalam gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan