ホームページ >バックエンド開発 >Golang >ループでスキャンする bufio スキャナーのタイムアウトを設定するにはどうすればよいですか?

ループでスキャンする bufio スキャナーのタイムアウトを設定するにはどうすればよいですか?

WBOY
WBOY転載
2024-02-06 08:05:071083ブラウズ

ループでスキャンする bufio スキャナーのタイムアウトを設定するにはどうすればよいですか?

質問内容

golang を使用してプロセスを開始し、出力を監視しています。プロセスは長時間実行されるため、終了するシグナルを送信できる必要があります。

次のコードはほとんどの場合正常に動作します。ただし、何らかの理由でプロセスに出力がない場合があり、for ループが scan() メソッドによってブロックされ、processfinishchan からのメッセージを受信できません。

scan() メソッドのタイムアウトを設定する簡単な方法はありますか?別のゴルーチンで scan() を実行し、別の選択を使用して新しいゴルーチンとタイムアウト チャネルから受信することで解決策を試みましたが、外側の for ループを考慮すると、Will はますます多くのことを実行します。 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()
    }
}


正解


stdoutcmdobject.stdoutpipe()の結果であると仮定すると、読者は次のようにします。 be in プロセス終了後の待機中にリーダーを閉じ、進行中の読み取りを中断します。

wait はコマンドの終了を確認した後にパイプを閉じるため、ほとんどの呼び出し元は自分でパイプを閉じる必要はありません。

したがって、別の goroutine でプロセスを強制終了し、プロセスを強制終了した後 待機してプロセスの発生を確認し、リーダーを閉じる必要があります。

リーリー

以上がループでスキャンする bufio スキャナーのタイムアウトを設定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。