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() } }
stdout
がcmdobject.stdoutpipe()
の結果であると仮定すると、読者は次のようにします。 be in プロセス終了後の待機中にリーダーを閉じ、進行中の読み取りを中断します。
wait はコマンドの終了を確認した後にパイプを閉じるため、ほとんどの呼び出し元は自分でパイプを閉じる必要はありません。
したがって、別の goroutine でプロセスを強制終了し、プロセスを強制終了した後 待機してプロセスの発生を確認し、リーダーを閉じる必要があります。
以上がループでスキャンする bufio スキャナーのタイムアウトを設定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。