提升应用性能:Go中的同步与异步处理

在异步处理方式中,任务独立并同时执行。这意味着程序在一个任务完成之前不会等待它继续下一个任务。在Golang中,可以使用Goroutines和Go运行时来实现异步编程。
首页 新闻资讯 行业资讯 提升应用性能:Go中的同步与异步处理

在开发过程中,当需要同时处理多个操作时,开发者经常面临同步和异步两种处理方式的选择。

同步处理

在同步处理方式中,任务按顺序一个接一个地执行。每个任务必须在下一个任务开始之前完成。这意味着如果某个任务需要花费大量时间来完成,它可能会阻塞后续任务的执行,导致潜在的性能瓶颈。

一个简单的现实生活中的例子是两个人在喝啤酒时进行对话。一个人说一些话并提问,另一个人根据情况回应,然后反过来...

在下面的示例中,每个URL调用必须完成其整个请求-响应周期并提供响应或错误,以便可以进行后续的URL调用。

package mainimport("fmt""net/http")func makeUrlCall(url string){
 _,err :=http.Get(url)iferr!=nil {
  fmt.Println("Got error in connecting to url: ",url)}

 fmt.Println("Got the response from our url: ",url)}

func main(){

 fmt.Println("Welcome here !!")fmt.Println()//slice of urlsurlSlice :=[]string{"https://www.baidu.com","https://www.csdn.net","https://www.runoob.com",}foridx,url :=range urlSlice {
  fmt.Println("Calling url on index: ",idx)makeUrlCall(url)}

 fmt.Println()fmt.Println("End of sync processing !!")return}

输出:

Welcome here!!Calling urlonindex:0Got the responsefromour url:  https://www.baidu.comCalling urlonindex:1Got the responsefromour url:  https://www.csdn.netCalling urlonindex:2Got the responsefromour url:  https://www.runoob.comEndofsync processing!!

异步处理

在异步处理方式中,任务独立并同时执行。这意味着程序在一个任务完成之前不会等待它继续下一个任务。在Golang中,可以使用Goroutines和Go运行时来实现异步编程。

一个简单的现实生活中的例子是去汽车修理店。一旦工程师处理完其他任务,他们会处理你的任务。在此期间,你可以做其他重要的事情,直到你的汽车被取走并修好。

在下面的示例中,每个URL调用将通过goroutine在自己的线程中进行,并根据需要处理响应。

package mainimport("fmt""net/http""sync")func makeUrlCall(url string){
 _,err :=http.Get(url)iferr!=nil {
  fmt.Println("Got error in connecting to url: ",url)}

 fmt.Println("Got the response from our url: ",url)}

func main(){
 fmt.Println("Welcome here !!")fmt.Println()//slice of urlsurlSlice :=[]string{"https://www.baidu.com","https://www.csdn.net","https://www.runoob.com",}

 var wg sync.WaitGroupfor_,u :=range urlSlice {
  wg.Add(1)//all the url's to get error/response are called in their own separate thread via goroutinesgo func(url string){
   defer wg.Done()makeUrlCall(url)}(u)}

 wg.Wait()fmt.Println()fmt.Println("End of sync processing !!")return}

输出:

Welcome here!!Got the responsefromour url:  https://www.baidu.comGot the responsefromour url:  https://www.runoob.comGot the responsefromour url:  https://www.csdn.netEndofsync processing!!

如果我们在切片中添加更多的URL并进行更多的HTTP get请求,比较两种方式的性能。

39    2023-11-06 08:01:09    Go 同步 异步