【Go中的同步与异步处理】在开发过程中,当需要同时处理多个操作时,开发者经常面临同步和异步两种处理方式的选择 。
同步处理在同步处理方式中 , 任务按顺序一个接一个地执行 。每个任务必须在下一个任务开始之前完成 。这意味着如果某个任务需要花费大量时间来完成 , 它可能会阻塞后续任务的执行,导致潜在的性能瓶颈 。
一个简单的现实生活中的例子是两个人在喝啤酒时进行对话 。一个人说一些话并提问,另一个人根据情况回应 , 然后反过来...
在下面的示例中,每个URL调用必须完成其整个请求-响应周期并提供响应或错误,以便可以进行后续的URL调用 。
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 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 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请求,比较两种方式的性能 。
推荐阅读
- AIDL在Android应用程序中的重要作用
- Gorm 中的迁移指南
- 面向跨领域数据的迁移学习算法与模型研究
- 微信用户当心!警方最新提醒
- 张靓颖:与冯轲相爱15年,被骗走6亿身家,离婚4年后二人天差地别
- 河南2019:荒唐闹剧与不伦之恋
- 若烟的寓意,烟与烟囱的寓意
- 生甘草的功效与作用
- 艾叶功效与作用
- 陆毅晒与俩女儿的合照!47岁保养到位,与贝儿坐一起,宛如兄妹