Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menetapkan tamat masa untuk pengimbas bufio yang mengimbas dalam gelung?
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() } }
Andaikan keputusan stdout
是 cmdobject.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() }
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!