延时处理
package main
import (
"context"
"fmt"
"io/ioutil"
"net/http"
"time"
)
// 自定义结构
type Result struct {
r *http.Response
err error
}
// 延时处理
func process() {
// 上下文
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
tr := &http.Transport{}
// 客户端
client := &http.Client{Transport: tr}
// 管道用于处理延时
c := make(chan Result, 1)
// 建立请求
req, err := http.NewRequest("GET", "http://www.geogle.com", nil)
if err != nil {
fmt.Println("http request failed, err:", err)
return
}
// 做请求,结果放进通道
go func() {
resp, err := client.Do(req)
pack := Result{r: resp, err: err}
c <- pack
}()
// 2种类型,延时后还没做则取消,否则读出结果
select {
case <-ctx.Done():
tr.CancelRequest(req)
res := <-c
fmt.Println("Timeout! err:", res.err)
case res := <-c:
defer res.r.Body.Close()
out, _ := ioutil.ReadAll(res.r.Body)
fmt.Printf("Server Response: %s", out)
}
return
}
func main() {
process()
}
context.Context
package main
import (
"context"
"fmt"
)
// context.Context key-val的使用
func process(ctx context.Context) {
ret, ok := ctx.Value("trace_id").(int)
if !ok {
ret = 21342423
}
fmt.Printf("ret:%d\n", ret)
s, _ := ctx.Value("session").(string)
fmt.Printf("session:%s\n", s)
}
func main() {
ctx := context.WithValue(context.Background(), "trace_id", 13483434)
ctx = context.WithValue(ctx, "session", "sdlkfjkaslfsalfsafjalskfj")
process(ctx)
}
主线程等待全部子线程结束的方法
package main
import (
"fmt"
"sync"
"time"
)
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go calc(&wg, i)
}
wg.Wait()
fmt.Println("all goroutine finish")
}
func calc(w *sync.WaitGroup, i int) {
fmt.Println("calc:", i)
time.Sleep(time.Second)
w.Done()
}