Go语言etcd、context、kafka消费实例、logagent

延时处理

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()
}

发布了40 篇原创文章 · 获赞 26 · 访问量 7676

猜你喜欢

转载自blog.csdn.net/weixin_44879611/article/details/104580634
今日推荐