【golang】go语言,进行并发请求的wrap变参封装

zhangqingping · · 2662 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "sync"
    "time"
)

type WaitGroupWrapper struct {
    sync.WaitGroup
}

func (w *WaitGroupWrapper) Wrap(cb func(argvs ...interface{}), argvs ...interface{}) {
    w.Add(1)
    go func() {
        cb(argvs...)
        w.Done()
    }()
}

type MyStruct struct {
    Age  int
    Name string
    Sex  bool
}

func GetAge(argvs ...interface{}) {
    age := argvs[0].(int)
    my := argvs[1].(*MyStruct)
    my.Age = age
    time.Sleep(time.Second * 1)
    fmt.Println("age done")
}

func GetName(argvs ...interface{}) {
    name := argvs[0].(string)
    my := argvs[1].(*MyStruct)
    my.Name = name
    time.Sleep(time.Second * 2)
    fmt.Println("name done")
}

func GetSex(argvs ...interface{}) {
    my := argvs[0].(*MyStruct)
    my.Sex = false
    time.Sleep(time.Second * 3)
    fmt.Println("sex done")
}

func main() {
    var wg WaitGroupWrapper
    var my MyStruct
    wg.Wrap(GetAge, 10, &my)
    wg.Wrap(GetName, "test", &my)
    wg.Wrap(GetSex, &my)
    wg.Wait()
    fmt.Println(my)
}

这段标红的代码,做的事情就对需要并行进行函数的一个封装,当所有的函数完成时,才会返回。

$time ./wrappertest

age done
name done
sex done
{10 test false}

real    0m3.011s
user    0m0.001s
sys    0m0.005s

 

当前业务中,其中一个用户请求,需要查询多次nosql,为了不串行等待,做了一个异步的wrap封装,每个查询都自己启动一个go程来进行。

当然,有其它并行网络/io请求需要的也都可以这么做,这里使用了interface的变参,具体的实现函数和调用者,都需要明白每个参数的类型。


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:zhangqingping

查看原文:【golang】go语言,进行并发请求的wrap变参封装

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2662 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传