淺析Go語(yǔ)言中的同步與異步處理
同步處理
在同步處理方式中,任務(wù)按順序一個(gè)接一個(gè)地執(zhí)行。每個(gè)任務(wù)必須在下一個(gè)任務(wù)開(kāi)始之前完成。這意味著如果某個(gè)任務(wù)需要花費(fèi)大量時(shí)間來(lái)完成,它可能會(huì)阻塞后續(xù)任務(wù)的執(zhí)行,導(dǎo)致潛在的性能瓶頸。
一個(gè)簡(jiǎn)單的現(xiàn)實(shí)生活中的例子是兩個(gè)人在喝啤酒時(shí)進(jìn)行對(duì)話。一個(gè)人說(shuō)一些話并提問(wèn),另一個(gè)人根據(jù)情況回應(yīng),然后反過(guò)來(lái)...
在下面的示例中,每個(gè)URL調(diào)用必須完成其整個(gè)請(qǐng)求-響應(yīng)周期并提供響應(yīng)或錯(cuò)誤,以便可以進(jìn)行后續(xù)的URL調(diào)用。
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 !!
異步處理
在異步處理方式中,任務(wù)獨(dú)立并同時(shí)執(zhí)行。這意味著程序在一個(gè)任務(wù)完成之前不會(huì)等待它繼續(xù)下一個(gè)任務(wù)。在Golang中,可以使用Goroutines和Go運(yùn)行時(shí)來(lái)實(shí)現(xiàn)異步編程。
一個(gè)簡(jiǎn)單的現(xiàn)實(shí)生活中的例子是去汽車修理店。一旦工程師處理完其他任務(wù),他們會(huì)處理你的任務(wù)。在此期間,你可以做其他重要的事情,直到你的汽車被取走并修好。
在下面的示例中,每個(gè)URL調(diào)用將通過(guò)goroutine在自己的線程中進(jìn)行,并根據(jù)需要處理響應(yīng)。
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 !!
如果我們?cè)谇衅刑砑痈嗟腢RL并進(jìn)行更多的HTTP get請(qǐng)求,比較兩種方式的性能。
到此這篇關(guān)于淺析Go語(yǔ)言中的同步與異步處理的文章就介紹到這了,更多相關(guān)Go同步與異步處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議
錯(cuò)誤處理在每個(gè)語(yǔ)言中都是一項(xiàng)重要內(nèi)容,眾所周知,通常寫程序時(shí)遇到的分為異常與錯(cuò)誤兩種,Golang中也不例外,這篇文章主要給大家介紹了一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議,需要的朋友可以參考下2021-09-09簡(jiǎn)單聊聊Go語(yǔ)言中空結(jié)構(gòu)體和空字符串的特殊之處
在日常的編程過(guò)程中,大家應(yīng)該經(jīng)常能遇到各種”空“吧,比如空指針、空結(jié)構(gòu)體、空字符串等,本文就以?Go?語(yǔ)言為例,一起來(lái)看看空結(jié)構(gòu)體和空字符串在?Go?語(yǔ)言中的特殊之處吧2024-03-03Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享
jwt是?json?web?token的簡(jiǎn)稱。go使用jwt目前,主流使用的jwt庫(kù)是golang-jwt/jwt。本文就來(lái)和大家講講golang-jwt/jwt的具體使用,需要的可以參考一下2023-01-01Golang實(shí)現(xiàn)Redis過(guò)期時(shí)間實(shí)例探究
這篇文章主要介紹了Golang實(shí)現(xiàn)Redis過(guò)期時(shí)間實(shí)例探究,2024-01-01解決Go語(yǔ)言time包數(shù)字與時(shí)間相乘的問(wèn)題
這篇文章主要介紹了Go語(yǔ)言time包數(shù)字與時(shí)間相乘的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04