質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

2229閲覧

Golang. <-ctx.Done()の発火タイミング

Shika_Tech

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2021/09/04 11:14

前提・実現したいこと

Golang gorutine 内の<-ctx.Done()について理解したい。

発生している問題

以下の記事で
https://qiita.com/p1ass/items/462209fe73ece1238d85

go

1 go func() { 2 <-ctx.Done() 3 r.mutex.Lock() 4 delete(r.messageChannels, user) 5 r.mutex.Unlock() 6 r.redisClient.Del(user) 7 }()

上記のようなコードが出てきますが、
<-ctx.Done()の部分がどうしても理解できません。

<-ctx.Done()
このようなコードは下記のように
case <-ctx.Done():

select caseと共に使用してキャンセル時に発火するというような解説はよく見かけるのですが、

go

1 go func() { 2 <-ctx.Done()

上記のような場合はどのように処理が進むのでしょうか?

ご回答頂けますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

context.Canceledまたはcontext.DeadlineExceededがctx.Err()で返される状態になったら発火します。

そうなる条件は以下の2つです。

  • 「conetxt.WithCancel()が返すcancelFuncを呼んだ時」
  • 「context.WithDeadline()またてゃconttext.WithTimeout()が設定する時刻が経過した時」

なので下記の「...」部分が実行されるのは以上の条件が成立するまで待たされます。
(つまり、このgorouttineは何かの終了を待って後始末をするために待機するという役割です。)

go

1go func() { 2 <-ctx.Done() 3 ... 4}

ちなみにcontext.Background()が返すContextでは<-ctx.Done()が発火することはありません。

投稿2021/09/04 21:54

編集2021/09/04 21:59
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shika_Tech

2021/09/05 03:47

回答ありがとうございます! > 「conetxt.WithCancel()が返すcancelFuncを呼んだ時」 > 「context.WithDeadline()またてゃconttext.WithTimeout()が設定する時刻が経過した時」 上記2点ですね、理解できました。 goroutine内で使われる時は select case しないのが一般的なのでしょうか? それとも キャンセル時の処理しか必要ない為に select case を書いてないだけなのでしょうか?
nobonobo

2021/09/05 05:00

多くの用途では繰り返しの中で中断する時にselectでハンドルします。 selectでハンドルしないのは少ないかな。
Shika_Tech

2021/09/05 05:21

なるほどですね!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問