タイムアウト時にゴルーチンの実行を停止: フォークジョイン モデルの制限
Go のフォークジョイン同時実行モデルでは、ゴルーチンの実行を一度中断することはできません開始されました。チャネルからの読み取りにタイムアウトを設定できますが、チャネルへのゴルーチンの書き込みの実行は停止しません。
例の説明
提供されたコード内:
- Find 関数はバッファリングされたチャネルを作成し、ゴルーチンを起動して応答を送信します。 10 秒。
- select ステートメントには、チャネルから受信する場合と、50 ミリ秒後にタイムアウトする場合の 2 つのケースがあります。
- ゴルーチンは、タイムアウト後も最終的に応答を送信するため、目的の出力が得られません。
を理解する制限事項
ゴルーチンを中断できないのは、Go のフォーク結合モデルに起因します。
- ゴルーチンはメインスレッドからフォークされ、直接制御せずに同時に実行されます。
- チャネル通信などの結合ポイントは、同期が行われる唯一のインスタンスです
- チャネル受信側に設定されたタイムアウトは、送信側ゴルーチンの実行には影響しません。
代替アプローチ
直接割り込みは不可能ですが、別のアプローチが考えられます採用:
-
コンテキストのキャンセル: コンテキストをゴルーチンに関連付け、タイムアウト時にそれをキャンセルし、ゴルーチンがシグナルを受信して終了します。
-
別のプロセス: 別のプロセスでゴルーチンを開始し、次の場合は終了します。必要です。
以上がタイムアウト後に Go Goroutine を完了前に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。