首页 > 其他分享 >提升应用性能:Go中的同步与异步处理

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

时间:2023-11-06 12:55:25浏览次数:29  
标签:异步 www 同步 url fmt Println https Go

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

原创 TimLiu 爱发白日梦的后端 2023-11-06 08:00 发表于广东 收录于合集#go90个 爱发白日梦的后端 专注 Go 语言领域的发展,学习成为更牛逼的架构师,日常分享 Go 语言、架构、软件工具的使用。 124篇原创内容 公众号

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

同步处理

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

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

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

package main

import (
 "fmt"
 "net/http"
)

func makeUrlCall(url string) {
 _, err := http.Get(url)
 if err != 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 urls
 urlSlice := []string{
  "https://www.baidu.com",
  "https://www.csdn.net",
  "https://www.runoob.com",
 }

 for idx, url := range urlSlice {
  fmt.Println("Calling url on index: ", idx)
  makeUrlCall(url)
 }

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

 return
}

输出:

Welcome here !!

Calling url on index:  0
Got the response from our url:  https://www.baidu.com
Calling url on index:  1
Got the response from our url:  https://www.csdn.net
Calling url on index:  2
Got the response from our url:  https://www.runoob.com

End of sync processing !!

异步处理

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

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

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

package main

import (
 "fmt"
 "net/http"
 "sync"
)

func makeUrlCall(url string) {
 _, err := http.Get(url)
 if err != 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 urls
 urlSlice := []string{
  "https://www.baidu.com",
  "https://www.csdn.net",
  "https://www.runoob.com",
 }

 var wg sync.WaitGroup

 for _, u := range urlSlice {
  wg.Add(1)
  //all the url's to get error/response are called in their own separate thread via goroutines
  go func(url string) {
   defer wg.Done()

   makeUrlCall(url)
  }(u)
 }

 wg.Wait()

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

 return
}

输出:

Welcome here !!

Got the response from our url:  https://www.baidu.com
Got the response from our url:  https://www.runoob.com
Got the response from our url:  https://www.csdn.net

End of sync processing !!

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

关注和添加微信

进技术交流群,带你徜徉在知识的海洋中

图片

 

 

TimLiu

赞赏二维码喜欢作者

收录于合集 #go  90个 上一篇Go语言中的闭包:封装数据与功能的强大工具   阅读 142 爱发白日梦的后端 ​ 喜欢此内容的人还喜欢   Go etcd 的依赖问题终于解决了。。。     我看过的号 爱发白日梦的后端 不看的原因   Go语言处理错误的正确姿势     我看过的号 程序员技术成长之路 不看的原因   GO、KEGG富集分析加绘图一个脚本搞定     生信七点半 不看的原因   关注公众号后可以给作者发消息            

人划线

 

标签:异步,www,同步,url,fmt,Println,https,Go
From: https://www.cnblogs.com/cheyunhua/p/17812392.html

相关文章

  • Golang面试题从浅入深高频必刷「2023版」
    大家好,我是阳哥。专注Go语言的学习经验分享和就业辅导。Go语言特点Go语言相比C++/Java等语言是优雅且简洁的,是我最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Python优雅的调用三方库和管理项目,同时还有接口,自动垃圾回收和goroutine等让人拍案叫绝的设计。有许多基于......
  • 企业文件夹同步,飞驰云联让数据管理更高效
    随着企业数据量的不断增加,如何高效地进行文件夹同步已成为企业提升工作效率、确保数据安全的重要一环。飞驰云联的同步软件作为一款专门针对企业级用户的数据同步解决方案,在实践中表现出色,值得信赖。飞驰云联的同步软件是一款高效、稳定、易用的企业级文件夹同步工具。它支持多......
  • Eolink Apikit 版本更新:数据字典功能上线、支持 MongoDB 数据库操作...
    ......
  • Django实战项目-学习任务系统-配置定时调度任务
    接着上期代码内容,继续完善优化系统功能。 本次增加配置定时调度任务功能,学习任务系统定时任务管理添加的定时学习任务,需要通过配置调度任务,定时发布周期性的学习任务。以及每天定时发送学生用户属性值,积分值等信息到学生用户知晓。以及其他需要定时调度的任务都可以配置到定时......
  • Hadoop整合AWS S3和Google gcs对象存储实践
    1.背景https://blog.51cto.com/u_15327484/8193991介绍了海外Hadoop集群一般将冷数据放入到AWSS3或者存放到Googlegcs对象存储中。这些对象存储都提供了各自的客户端进行访问,例如awss3的客户端命令就是awss3;gcs的客户端命令是gsutil。这些命令一般需要直接登陆到授权机器中执......
  • 饮冰三年-人工智能-Django淘宝拾遗-86- Django Debug Toolbar调试工具
       在开发Django应用程序时,调试是不可或缺的一部分。DjangoDebugToolbar是一个强大的调试工具,可以帮助开发者深入了解应用程序的性能和执行细节。本文将介绍DjangoDebugToolbar的安装步骤以及如何在Django应用程序中使用该工具。项目使用的是github上开源的项目......
  • Go 生成protobuf示例
    先安装好工具goinstallgoogle.golang.org/protobuf/cmd/[email protected]/grpc/cmd/protoc-gen-go-grpc@latest下载安装protocwgethttps://github.com/protocolbuffers/protobuf/releases/download/v25.0/protoc-25.0-linux-x86_64.zip......
  • 1820_ChibiOS中的同步消息
    GreyZhang/g_ChibiOS:IfoundanewRTOScalledChibiOSanditseemsinteresting!(github.com)1.看到这里提到的这个模型,我在想是不是我一直没有搞定的多核可以利用这个机制来解决。如果是多核,ChibiOS的这种机制是否依然奏效?这是一个后续需要去弄清楚的问题。2.之前看消息传......
  • java IO流:介绍下阻塞、非阻塞、同步、异步 I/O 的概念
    这里先介绍下阻塞、非阻塞、同步、异步I/O的概念。先来看看阻塞I/O,当用户程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read才会返回。注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两......
  • Go语言使用range修改值,需要使用切片的指针 &slice[index]
    由于Value是值拷贝的,并非引用传递,所以直接改Value是达不到更改原切片值的目的的,需要通过&slice[index]获取真实的地址packagemainimport("fmt")funcmain(){ slice:=[]int{10,20,30,40} forindex,value:=rangeslice{ fmt.Printf("Value=%d,value-addr......