ホームページ  >  記事  >  バックエンド開発  >  golangでIDに基づいてチャネルジョブをキャンセルする方法

golangでIDに基づいてチャネルジョブをキャンセルする方法

PHPz
PHPz転載
2024-02-08 23:42:11733ブラウズ

golangでIDに基づいてチャネルジョブをキャンセルする方法

golang では、チャネル ジョブのキャンセルは一般的な要件です。並行タスクを処理している場合、タスク ID に基づいて実行中のタスクをキャンセルする必要がある場合があります。では、この関数を golang で実装するにはどうすればよいでしょうか?以下に簡単で効果的な方法を紹介します。まず、タスクの ID を保存するためのバッファー チャネルを作成する必要があります。次に、select ステートメントを使用してチャネル上の読み取り操作をリッスンし、タスクをキャンセルする必要があるときにタスクの ID をチャネルに送信します。そして、タスク実行機能では、チャネルが閉じられているかどうかを判断することで、タスクをキャンセルする必要があるかどうかを判断できます。チャネルが閉じられている場合、タスクはキャンセルされているため、適切な場所でタスクの実行を終了できます。このようにして、golang で ID に基づいてチャネル ジョブを簡単にキャンセルできます。以上はphpエディタのXinyiさんが紹介した方法ですので、皆さんのお役に立てれば幸いです!

質問の内容

したがって、ジョブを作成して chan に追加する post エンドポイントがあります。 workerjobschan = make(chan job, maxqueuesize)

これは、チャネル (main.go) でジョブを実行する方法です:

リーリー

キャンセル関数をマップに保存します: canceljobfuncs = make(map[int]context.cancelfunc)

これは職務内容です:

リーリー

次のように (http ハンドラー内で) コンテキストをキャンセルします。

リーリー

ただし、ジョブは引き続き実行されます。いろいろ試してみましたが、うまくいかないようです。

回避策

明白な点を説明する方法は次のとおりです。コードが ctx.done() をチェックしない場合、コードはそれがチェックされていることを知る方法がありません。キャンセルされました。
(ところで、これは @jimb があなたの質問のコメントに書いたことの別の言い換えです)。

したがって、.execute(...) メソッドのコードがこのブロックの実行を開始すると、次のようになります。 リーリー

ブロックの最後(7秒)に到達します。キャンセル時に停止するという指示はありません。

「スリープ」命令中のキャンセルを関数で検出できるようにしたい場合は、コードを変更する必要があります。

あなたの例を使用してこれを行う方法の例を次に示します:

リーリー

https://www.php.cn/link/3bc31a430954d8326605fc690ed22f4d

実際のコードには

time.sleep() ディレクティブはなく、processsearch(...) または doquery(...)# があると思います。 ## または...### これらの関数を実行中にキャンセル可能にする必要がある場合は、何らかの方法でキャンセル コンテキストを関数に渡し、何らかの方法でキャンセルをチェックさせる必要があります。

「コンテキストを渡す」方法の 1 つは、明らかに、それを関数のパラメータに追加することです。 リーリー

ただし、既存のコードによっては、一部のパラメーターにキャンセルするための組み込みメソッドが既に組み込まれている場合があります。

例えば:### リーリー

以上がgolangでIDに基づいてチャネルジョブをキャンセルする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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