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


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

    同步处理

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

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

    在下面的示例中,每个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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    输出:

    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 !!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    异步处理

    在异步处理方式中,任务独立并同时执行。这意味着程序在一个任务完成之前不会等待它继续下一个任务。在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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    输出:

    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 !!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

  • 相关阅读:
    跨境流量新入口Discord,如何利用他进行海外营销?
    全国366个市县日度空气质量数据(2016-2020年)(AQI,SO2,NO2,PM2.5,PM10)
    探讨Linux CPU的上下文切换原由
    selenium +IntelliJ+firefox/chrome 环境全套搭配
    Java多线程探究【一线程简介、实现】
    SQL语法基础-其他函数V
    LeetCode LCR024.反转链表 经典题目 C写法
    【Android】
    系统分析与设计 复习
    GMAC & PHY介绍
  • 原文地址:https://blog.csdn.net/liufotian/article/details/134256563