加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang 果然是大杀器

发布时间:2020-12-16 18:44:19 所属栏目:大数据 来源:网络整理
导读:已经将一个Service改成用Golang实现,效果非常好!这个Service的代码已经开源,GoTasks。 Golang是我目前接触过的语言中,并发编程效率最高。node.js虽然也高,但是时间精准度上,就远远不如Golang了。 一开始看了很多网上的教程,搞得乱七八糟的,后来重新

已经将一个Service改成用Golang实现,效果非常好!这个Service的代码已经开源,GoTasks。

Golang是我目前接触过的语言中,并发编程效率最高。node.js虽然也高,但是时间精准度上,就远远不如Golang了。

一开始看了很多网上的教程,搞得乱七八糟的,后来重新整理一下思路,才发现他的go关键字的奥妙(网友能再坑爹一点不?)。

为什么说他的开发效率高呢,一个主要的原因是,你完全可以用阻塞的方式去封装一个函数,然后通过go关键字调用,使他在运行时并发,这点真的太恐怖了,闭包什么的弱爆了。

举个实际点的例子吧:

funcHttpGet(urlstring)(string,error){
resp,err:=http.Get(url)
iferr!=nil{
logger.Debug("HttpGet","请求错误:",err)
return"",err
}
deferresp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
logger.Debug("HttpGet","IO/Read错误:",err
}
returnstring(body),err
}

funcHttpPost(reqUrlstring,poststring)(string,err:=http.PostForm(reqUrl,url.Values{"data":{post}})
iferr!=nil{
logger.Debug("HttpPost",err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
logger.Debug("HttpPost",err
}

假定我有这2个函数,HttpGet、HttpPost,执行肯定会造成阻塞,为了调试方便,阻塞的方式对单个函数的检测,肯定更加容易调试,更加容易监控函数是不是有bug。

但是到了实际执行层面,我们就肯定希望他不要有任何阻塞:

func(task*Task)start(){
ch:=make(chanint)
gotask.request()
gotask.startTicker()
<-ch
}

func(task*Task)request(){
logger.Log(task.Name,"开始")
start:=time.Now()
resp,_:=HttpGet(task.Url)
complete:=time.Now()
ifglobalConfig.ShowComplete>0{
logger.Log(task.Name,"完成:",complete.Sub(start),"响应内容长度:",len(resp))
}
iflen(task.PostUrl)>0{
HttpPost(task.PostUrl,resp)
}
}

这个代码取自GoTasks的task_service.go,request函数,包装了一个task的任务,先发起一个Get请求,等请求返回以后,将Get的内容发起一个Post请求将内容发送到指定的Url上。request本身是阻塞执行的,而在start中,调用他的方法时候,只要使用go,即可让他并发执行(实际上是发起了go内部调度的子线程之类的东西)。然后在通过channel对这个资源进行回收。

就如朋友所说,恭喜你,终于获得件橙色装备了!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读