当前位置:首页 >探索 >提升应用性能:Go中的同步与异步处理 任务独立并同时执行

提升应用性能:Go中的同步与异步处理 任务独立并同时执行

2024-06-29 05:23:02 [百科] 来源:避面尹邢网

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

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

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

同步处理

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

提升应用性能:Go中的同步与异步处理 任务独立并同时执行

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

提升应用性能:Go中的同步与异步处理 任务独立并同时执行

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

提升应用性能:Go中的同步与异步处理 任务独立并同时执行

package mainimport ( "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:  0Got the response from our url:  https://www.baidu.comCalling url on index:  1Got the response from our url:  https://www.csdn.netCalling url on index:  2Got the response from our url:  https://www.runoob.comEnd of sync processing !!

异步处理

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

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

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

package mainimport ( "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.comGot the response from our url:  https://www.runoob.comGot the response from our url:  https://www.csdn.netEnd of sync processing !!

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

责任编辑:武晓燕 来源: 爱发白日梦的后端 Go同步异步

(责任编辑:百科)

    推荐文章
    热点阅读