zoukankan      html  css  js  c++  java
  • 【golang】go语言,进行并发请求的wrap变参封装

    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的变参,具体的实现函数和调用者,都需要明白每个参数的类型。

  • 相关阅读:
    PHP多表取数据的代码优化
    PHP json_encode中文乱码解决方法
    jQuery_Ajax_Json 异步接收PHP端传来的json数据
    metamask源码学习-controller-transaction
    metamask源码学习-contentscript.js
    metamask源码学习-background.js
    metamask源码学习导论
    metamask源码学习-metamask-controller.js
    metamask源码学习-inpage.js
    Guide to Porting MetaMask to a New Environment
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/4877559.html
Copyright © 2011-2022 走看看