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

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

同步处理

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

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

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

go 复制代码
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
}

输出:

go 复制代码
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在自己的线程中进行,并根据需要处理响应。

go 复制代码
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
}

输出:

go 复制代码
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请求,比较两种方式的性能。

相关推荐
JavaGuide12 分钟前
一个 SKILL.md 拿下 2.3 万 Star:让 Codex/Claude Code 少说废话、先给答案
前端·后端
陈随易8 小时前
pm2 替代品,nodejs&bun 线上部署必备工具
前端·后端·程序员
丘山一郎8 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野8 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite8 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
MC皮蛋侠客9 小时前
Tauri 2.x 系列(五):调用系统 API——官方插件、Rust crate 与原生能力
开发语言·后端·rust
Profile排查笔记11 小时前
指纹浏览器怎么设置 IP?代理配置、检测与排错流程
前端·人工智能·后端·自动化
IT_陈寒12 小时前
SpringBoot自动配置失效?你可能漏了这个小开关
前端·人工智能·后端
摇滚侠13 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
用户83562907805113 小时前
使用 Python 在 Excel 中插入 OLE 对象
后端·python