ゴルーチンをブロックすることなく、行われているかどうかはどのように見つけるのですか?
-
20-09-2019 - |
質問
私が見てきたすべての例では、これまでのところ(<-chan
事業者を経由して)結果を得るために、ブロッキング関与します。
私の現在のアプローチは、構造体へのポインタを渡す必要:
type goresult struct {
result resultType;
finished bool;
}
ゴルーチンが完了時に書き込みます。そして、それはいつでも便利finished
をチェックするだけの簡単な作業です。あなたがより良い選択肢を持っていますか?
私は本当にを目指してることはQtのスタイルの信号スロットシステムです。私は解決策は、(chan
s持っている<私>がたくさんの未踏のポテンシャルの)ほとんど自明になります直感を持っているが、私はそれを把握するための言語でまだ十分慣れていないんだよ。
解決
あなたは「カンマ、OK」パターン(「実効行くの上で自分のページを参照してくださいを使用することができます「):
foo := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
他のヒント
は(ランダムな枝を取って、一度に複数のチャンネルを確認することができますの文を選択します通信が待機しているもの)のます:
func main () {
for {
select {
case w := <- workchan:
go do_work(w)
case <- signalchan:
return
// default works here if no communication is available
default:
// do idle work
}
}
}
すべての送信用と受信 「選択」声明で表現、 チャネル式が評価され、 表示される任意の式と一緒に センドの右側に 上から下への順で表現。 結果の操作のいずれか可能であれば 進んで、一つが選ばれたとされます 対応する通信と 文が評価されます。そうでなければ、 デフォルトのケースが存在する場合、その 実行します。ない場合は、文のブロック コミュニケーションの一つができるまで 完全ます。
また、それがlenを使って、何が含まれているかどうかを確認するためにチャネルバッファを覗くことができます:
if len(channel) > 0 {
// has data to receive
}
この値を削除しfoo, gotValue := <- ch
異なり、チャネルバッファに触れないときgotValue == true
。