ホームページ >バックエンド開発 >Golang >ページ分割されたクエリをキャンセルする際の不正確なタイミングを処理するためのテスト

ページ分割されたクエリをキャンセルする際の不正確なタイミングを処理するためのテスト

WBOY
WBOY転載
2024-02-14 10:42:08999ブラウズ

ページ分割されたクエリをキャンセルする際の不正確なタイミングを処理するためのテスト

データベース クエリを実行するとき、ページング クエリが頻繁に発生します。ただし、ページ分割されたクエリがキャンセルされると、タイミングの不正確さが発生する場合があります。この問題は、正確なタイミングが必要なアプリケーションにとって重要です。この記事では、PHP エディター Baicao が、タイミングの精度と精度を確保するためにこの問題に対処する方法を紹介します。この問題をよりよく理解し、対処できるように、考えられる原因と解決策をいくつか検討します。

質問の内容

クエリを非同期で実行できるページ分割された SQL クエリを作成するために使用されるオブジェクトがあります:

リーリー

このコード、特にキャンセル部分をテストしようとしています。私のテストコードは次のようになります:

リーリー

私が抱えている問題は、cancel() が呼び出されたときに、 at ステートメントを実行します - ctx.done または 。実行は、結果を results チャネルに送信するまで、ループ内のどこでも発生する可能性があります。しかし、これは意味がありません。なぜなら、results チャネルからデータを受信するまで実行がブロックされるはずであり、cancel() を呼び出すまでブロックされないからです。さらに、SQL テストには sqlmock パッケージを使用していますが、これでは SQL クエリのいかなる種類のファジングも許可されません。この不具合が発生するのはなぜですか?どうすれば修正できますか?

解決策

私の問題は、私自身が go チャネルを理解していないことが原因でした。

chan([]*t, 1) を作成すると、チャンネルがいっぱいになったとき (つまり、単一のアイテムが含まれているとき) にブロックされることを意味すると思っていましたが、そうではありません。代わりに、バッファーがいっぱいのときにチャネルに送信しようとすると、ブロックが発生します。したがって、results を次のように変更します: リーリー

チャネルに含まれるデータが受信されるまでチャネルがブロックされることを確認できます。この変更により、テストに関するすべての問題が解決されます。

以上がページ分割されたクエリをキャンセルする際の不正確なタイミングを処理するためのテストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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