検索
ホームページバックエンド開発GolangGolang のゴルーチンとチャネルのタイムアウトとキャンセルのメカニズム

Golang におけるゴルーチンとチャネルのタイムアウトとキャンセルのメカニズム

Golang では、ゴルーチンとチャネルは同時プログラミングの重要なコンポーネントです。ゴルーチンは、複数のタスクを同時に簡単に実行できるようにする Go 言語の軽量スレッドの実装です。チャネルはゴルーチン間の通信メカニズムであり、データの転送とタスクの同期に使用されます。

実際の並行プログラミングでは、ゴルーチンの実行時間を制御したり、特定の条件下でゴルーチンの実行をキャンセルしたりする必要がある場合があります。これらの機能を実現するために、Golang はタイムアウトとキャンセルのメカニズムを提供します。以下では、Golang でこれらのメカニズムを使用する方法と、対応するコード例を詳しく紹介します。

  1. Goroutines のタイムアウト機構

Goroutines のタイムアウト機構は、指定された時間内にタスクが実行されることを保証します。指定された時間を経過してもタスクが完了しない場合、タイムアウトによりタスクはキャンセルされます。 Golang は、この関数を実装するための context パッケージを提供します。以下は、Goroutines タイムアウト メカニズムを使用するサンプル コードです。

package main

import (
    "context"
    "fmt"
    "time"
)

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("任务被取消,退出 Goroutine")
            return
        default:
            fmt.Println("正在执行任务...")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    go worker(ctx)

    time.Sleep(10 * time.Second)
}

上記のコードでは、context.WithTimeout 関数を使用して、5 秒のタイムアウトを持つコンテキスト オブジェクトを作成します。 go worker(ctx) を呼び出して、Goroutine 実行タスクを開始します。タスクの実行中、select ステートメントを通じて ctx.Done() チャネルをリッスンし、キャンセル信号を受信した場合はゴルーチンを終了します。

main 関数では、time.Sleep(10 * time.Second) を通じて 10 秒の待機を設定していることに注意してください。これは、Goroutine が確実に実行されるようにするためです。実行がタイムアウトになりました。上記のコードを実行すると、5 秒のタイムアウトに達した後、worker Goroutine がキャンセル シグナルを受信して​​終了することがわかります。

  1. Goroutine のキャンセル メカニズム

Goroutine のキャンセル メカニズムは、特定の条件下で実行中のタスクをキャンセルできます。 context パッケージを使用してこの機能を実現することもできます。次のコード例を見てください。

package main

import (
    "context"
    "fmt"
    "time"
)

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("任务被取消,退出 Goroutine")
            return
        default:
            fmt.Println("正在执行任务...")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go worker(ctx)

    time.Sleep(5 * time.Second)

    cancel()
    fmt.Println("取消任务...")
    time.Sleep(2 * time.Second)
}

上記のコードでは、context.WithCancel 関数を使用してキャンセル コンテキスト オブジェクトを作成し、go worker(ctx)## を呼び出します。 # Goroutine 実行タスクを開始しました。タスクの実行中、select ステートメントを通じて ctx.Done() チャネルをリッスンし、キャンセル信号を受信した場合はゴルーチンを終了します。

main 関数では、time.Sleep(5 * time.Second) を通じて 5 秒の待機を設定し、cancel() を呼び出します。 タスクをキャンセルします。上記のコードを実行すると、cancel() を呼び出した後、worker Goroutine がすぐにキャンセル信号を受信して​​終了することがわかります。

概要:

上記のコード例を通じて、Golang のゴルーチンとチャネルのタイムアウトとキャンセルのメカニズムを学びました。

context パッケージを使用すると、タスクのタイムアウトおよびキャンセル操作を実装して、同時タスクの実行をより適切に制御できます。これは実際の並行プログラミングで非常に役立ち、タスクの正しい実行とリソースの解放を保証できます。

この記事が、Golang におけるゴルーチンやチャネルのタイムアウトやキャンセルの仕組みを理解していただき、実際の開発で柔軟に活用していただければ幸いです。読んでくれてありがとう!

以上がGolang のゴルーチンとチャネルのタイムアウトとキャンセルのメカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
GOアプリケーションでのロギングエラーGOアプリケーションでのロギングエラーApr 30, 2025 am 12:23 AM

効果的なGOアプリケーションエラーログには、詳細とパフォーマンスのバランスをとる必要があります。 1)標準のログパッケージの使用は簡単ですが、コンテキストがありません。 2)Logrusは、構造化されたログとカスタムフィールドを提供します。 3)Zapはパフォーマンスと構造化されたログを組み合わせますが、より多くの設定が必要です。完全なエラーロギングシステムには、エラー濃縮、ログレベル、集中ロギング、パフォーマンスの考慮事項、エラー処理モードを含める必要があります。

GO:ユースケースと考慮事項の空のインターフェイス(インターフェイス{})GO:ユースケースと考慮事項の空のインターフェイス(インターフェイス{})Apr 30, 2025 am 12:23 AM

emptyinterfacessoareinterfaceswithnometods、andingningundatatypes.1)asseeninthefmtpackage.2)usetheemcautiallydueTopoterisosofteTyaNDETYETYANDPERETINGISSUSES.2)

同時性モデルの比較:GOと他の言語同時性モデルの比較:GOと他の言語Apr 30, 2025 am 12:20 AM

go'sconcurrencyModelisuniquedueToitsueToitsutinesAndChannels、sublicationalightweight andefcient andparedtototototheded based basedinlanguageslikejava、python、andrust.1)

Goの並行性モデル:ゴルチンとチャンネルが説明しましたGoの並行性モデル:ゴルチンとチャンネルが説明しましたApr 30, 2025 am 12:04 AM

go'sconcurrencymodelusesesgoroutinesandchannelstomeconconconconconconconconconconconconming effectivilly.1)GoroutinesArelightweightThreadSthatalloweasyparelizationoftasks.2)Channelsfacilateatesafedataexchangengengengengengedines、crucialforsynchruniz

GOのインターフェイスと多型:コードの再利用性の達成GOのインターフェイスと多型:コードの再利用性の達成Apr 29, 2025 am 12:31 AM

インターフェースアンドポリマスを導入することは、codeReusablivedainability.1)defineinterfacesattherightabstractionlevel.2)useinterfacesfordependencyinjection.3)profilecodetAnageperformanceImpacts。

GOの「init」関数の役割は何ですか?GOの「init」関数の役割は何ですか?Apr 29, 2025 am 12:28 AM

initistingorunsoutomativiviseativeatializepackages andsetuptheenvironment.it'susefulforstingupglobalvariables、resources、およびperformingone-tastasksacrossanypackage.hoer'showitworks:1)Itcanbeusedinpackage、not not-justhe、

GOのインターフェイス構成:複雑な抽象化を構築しますGOのインターフェイス構成:複雑な抽象化を構築しますApr 29, 2025 am 12:24 AM

インターフェイスの組み合わせは、関数を小さな焦点を絞ったインターフェイスに分解することにより、GOプログラミングで複雑な抽象化を構築します。 1)リーダー、ライター、およびより近いインターフェイスを定義します。 2)これらのインターフェイスを組み合わせて、ファイルやネットワークストリームなどの複雑なタイプを作成します。 3)ProcessData関数を使用して、これらの組み合わせインターフェイスを処理する方法を示します。このアプローチはコードの柔軟性、テスト可能性、再利用性を高めますが、過度の断片化と組み合わせの複雑さを避けるために注意する必要があります。

goでinit機能を使用する場合の潜在的な落とし穴と考慮事項goでinit機能を使用する場合の潜在的な落とし穴と考慮事項Apr 29, 2025 am 12:02 AM

intionsingoareautomativitiveedemain foreThemain foreThemaindareusefurfurforseTup butChallenges.1)実行命令:rundistionsrunindediontionOrder.2)テスト:テスト:in functionsMayInterwithests、b

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。