コンテキストを使用して Go でタイムアウト制御を実装する方法
はじめに:
並行プログラムを作成する場合、タイムアウト制御は非常に重要なテクノロジです。プログラムが操作を実行する必要がある場合、指定された時間内に操作が完了できない場合は、操作を中断して他の処理を実行できるようにしたいと考えています。 Go 言語では、コンテキスト パッケージを使用してタイムアウト制御を実装できます。
import ( "context" "fmt" "time" )
次に、時間のかかる操作を実行する関数を定義します。関数では、select ステートメントを使用して、コンテキストの Done() シグナルがトリガーされるかどうかを監視します。トリガーされると、現在の操作が中断される可能性があります。
func doSomething(ctx context.Context) { // 模拟一个耗时操作 time.Sleep(5 * time.Second) select { case <-ctx.Done(): fmt.Println("操作被中断") return default: fmt.Println("操作执行成功") } }
次に、main 関数でコンテキスト オブジェクトを作成し、タイムアウトを 3 秒に設定する必要があります。
func main() { // 创建一个context对象,并设置超时时间为3秒 ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second) defer cancel() // 在新的goroutine中执行操作,并传入context对象 go doSomething(ctx) // 等待3秒,让操作有足够的时间执行 time.Sleep(3 * time.Second) }
上の例では、WithTimeout 関数を使用してタイムアウトを含むコンテキスト オブジェクトを作成し、それを doSomething 関数に渡します。次に、doSomething 関数の実行に十分な時間を与えるために、main 関数で 3 秒待機します。 doSomething 関数が 3 秒以内に実行された場合は、「操作は正常に実行されました」が出力され、3 秒を超えてタイムアウト信号がトリガーされた場合は、「操作は中断されました」が出力されます。
func worker(ctx context.Context, name string) { for { select { case <-ctx.Done(): fmt.Println(name, "被中断") return default: fmt.Println(name, "正常执行") time.Sleep(time.Second) } } } func main() { ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second) defer cancel() go worker(ctx, "worker1") go worker(ctx, "worker2") go worker(ctx, "worker3") // 等待3秒钟,观察goroutine的执行情况 time.Sleep(3 * time.Second) }
上記のコードでは、現在のゴルーチンの名前を継続的に出力し、1 秒間スリープするワーカー関数を定義します。次に、main 関数で 3 つのワーカーのゴルーチンを開始し、同じコンテキスト オブジェクトに渡しました。 WithTimeout 関数を使用して、タイムアウトを含むコンテキスト オブジェクトを作成し、それをワーカー関数に渡します。次に、main 関数で 3 秒待って、ゴルーチンの実行を観察します。 3 秒を超えると、タイムアウト信号がトリガーされ、ゴルーチンは「中断」を出力します。
概要:
コンテキスト パッケージを使用すると、同時操作のタイムアウト制御をエレガントに実装できます。並行プログラムを作成する場合、コンテキストを合理的に使用すると、プログラムの信頼性が向上するだけでなく、長期的なブロッキングが回避され、プログラムのパフォーマンスも向上します。この記事が、同時プログラミングにおけるタイムアウト制御の理解に役立つことを願っています。
以上がコンテキストを使用して Go でタイムアウト制御を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。