当前位置:网站首页>Usage scenarios of golang context
Usage scenarios of golang context
2022-07-05 06:12:00 【Dawnlighttt】
List of articles
1. Value passed
Value passing is just context An auxiliary function of , Not the core function . Usually we only use context To pass optional data that does not affect the main business logic , Like log information 、 Debugging information, meta information, etc .
package main
import (
"context"
"fmt"
)
func readContext(ctx context.Context) {
traceId, ok := ctx.Value("key").(string)
if ok {
fmt.Println("readContext key=", traceId)i
} else {
fmt.Println("readContext no key")
}
}
func main() {
ctx := context.Background()
readContext(ctx)
ctx = context.WithValue(ctx, "key", "beautiful")
readContext(ctx)
}
In the use of WithValue Yes ctx When packing , You can set a key-value Key value pair , stay goroutine Passed between .
2. Timeout control
http Request to set timeout
package main
import (
"context"
"fmt"
"time"
)
func httpRequest(ctx context.Context) {
for {
// Handle http request
select {
case <- ctx.Done():
fmt.Println("Request timed out")
return
case <- time.After(time.Second):
fmt.Println("Loading...")
}
}
}
func main() {
fmt.Println("start TestTimeoutContext")
ctx, cancel := context.WithTimeout(context.Background(), time.Second * 3)
defer cancel()
httpRequest(ctx)
time.Sleep(time.Second * 5)
}
//start TestTimeoutContext
//Loading...
//Loading...
//Request timed out
file io Or the Internet io Wait for time-consuming operations , You can check whether the remaining time is sufficient , Decide whether to proceed to the next step
package main
import (
"context"
"fmt"
"time"
)
func copyFile(ctx context.Context) {
deadline, ok := ctx.Deadline()
if ok == false {
return
}
// deadline.Sub(time.Now()) The difference between the deadline and the current time
isEnough := deadline.Sub(time.Now()) > time.Second * 5
if isEnough {
fmt.Println("copy file")
} else {
fmt.Println("isEnough is false return")
return
}
}
func main() {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second * 4))
defer cancel()
copyFile(ctx)
time.Sleep(time.Second * 5)
}
//isEnough is false return
3. Cancel control
goroutine Send a cancellation signal , Ensure that the logic emanates from yourself goroutine All cancelled successfully
package main
import (
"context"
"fmt"
"time"
)
func gen(ctx context.Context) <-chan int {
ch := make(chan int)
go func() {
var n int
for {
select {
case ch <- n:
n++
time.Sleep(time.Second)
case <-ctx.Done():
return
}
}
}()
return ch
}
func main() {
// Create a Cancel context
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for n := range gen(ctx) {
fmt.Println(n)
if n == 5 {
// Trigger after meeting the requirements cancel
cancel()
break
}
}
}
//0
//1
//2
//3
//4
//5
Reference material :
边栏推荐
- leetcode-6110:网格图中递增路径的数目
- [rust notes] 13 iterator (Part 2)
- Groupbykey() and reducebykey() and combinebykey() in spark
- Navicat連接Oracle數據庫報錯ORA-28547或ORA-03135
- Quickly use Amazon memorydb and build your own redis memory database
- Leetcode-3: Longest substring without repeated characters
- Implement an iterative stack
- Sqlmap tutorial (1)
- Sword finger offer II 058: schedule
- In depth analysis of for (VaR I = 0; I < 5; i++) {settimeout (() => console.log (I), 1000)}
猜你喜欢
Brief introduction to tcp/ip protocol stack
QQ电脑版取消转义符输入表情
Appium foundation - use the first demo of appium
Introduction et expérience de wazuh open source host Security Solution
Navicat连接Oracle数据库报错ORA-28547或ORA-03135
[practical skills] how to do a good job in technical training?
Open source storage is so popular, why do we insist on self-development?
Leetcode-6111: spiral matrix IV
shared_ Repeated release heap object of PTR hidden danger
How to adjust bugs in general projects ----- take you through the whole process by hand
随机推荐
Common optimization methods
[rust notes] 13 iterator (Part 2)
Brief introduction to tcp/ip protocol stack
Leetcode-1200: minimum absolute difference
Daily question 1984 Minimum difference in student scores
Introduction to convolutional neural network
On the characteristics of technology entrepreneurs from Dijkstra's Turing Award speech
数据可视化图表总结(一)
MatrixDB v4.5.0 重磅发布,全新推出 MARS2 存储引擎!
Dichotomy, discretization, etc
RGB LED infinite mirror controlled by Arduino
【Rust 笔记】15-字符串与文本(上)
Sqlmap tutorial (II) practical skills I
Over fitting and regularization
Data visualization chart summary (I)
LaMDA 不可能觉醒吗?
Traditional databases are gradually "difficult to adapt", and cloud native databases stand out
[cloud native] record of feign custom configuration of microservices
Open source storage is so popular, why do we insist on self-development?
[rust notes] 17 concurrent (Part 2)