Skip to content

Instantly share code, notes, and snippets.

@u110
Last active February 23, 2020 04:42
Show Gist options
  • Save u110/b1d928e311817c9fa405ece0e0ec873d to your computer and use it in GitHub Desktop.
Save u110/b1d928e311817c9fa405ece0e0ec873d to your computer and use it in GitHub Desktop.
gcloud sdk go と context(cancel, timeout)の動作
package main
import (
"cloud.google.com/go/bigquery"
"context"
"fmt"
"google.golang.org/api/iterator"
"log"
"os"
"time"
)
func main() {
doneCh := make(chan bool)
ctx := context.Background()
log.Println("start")
// 3sec後にtimeout
subCtx, cancelFunc := context.WithTimeout(ctx, time.Duration(3)*time.Second)
defer cancelFunc()
// // 以下のgoroutineを有効にすると、`context canceled` で終了
// go func() {
// // 2sec後にcancel
// time.Sleep(time.Duration(2) * time.Second)
// cancelFunc()
// }()
go func(subCtx context.Context) {
projectID := os.Getenv("GCP_PROJECT")
client, err := bigquery.NewClient(subCtx, projectID)
if err != nil {
message := fmt.Sprintf("Failed to create client: %v\n", err)
log.Println(message)
return
}
// timeout待ち
time.Sleep(time.Duration(5) * time.Second)
it := client.Datasets(subCtx)
for {
ds, err := it.Next()
if err == iterator.Done {
log.Println("iterator done.")
break
}
if err != nil {
log.Printf("iterate Dataset err: %v", err)
break
} else {
fmt.Println("Dataset:", ds.DatasetID)
}
}
select {
case <-subCtx.Done():
log.Println("subCtx Done")
default:
log.Println("default end.")
}
doneCh <- true
}(subCtx)
select {
case <-doneCh:
log.Println("doneCh end.")
}
}
@u110
Copy link
Author

u110 commented Feb 23, 2020

GCP_PROJECT="****" GOOGLE_APPLICATION_CREDENTIALS=****.json go run main.go
2020/02/23 13:28:17 start
2020/02/23 13:28:22 iterate Dataset err: context deadline exceeded
2020/02/23 13:28:22 subCtx Done
2020/02/23 13:28:22 doneCh end.

@u110
Copy link
Author

u110 commented Feb 23, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment