您好,登錄后才能下訂單哦!
這篇文章主要介紹了GoRoutines高性能同時進行多個Api調用怎么實現的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇GoRoutines高性能同時進行多個Api調用怎么實現文章都會有所收獲,下面我們一起來看看吧。
Golang是高效的,非常高效。這種效率在很大程度上要歸功于它在處理并發性問題時的獨特抽象。例如,Java將其線程映射為操作系統線程,而Go使用自己的goroutines調度器將其輕量級goroutines從操作系統線程中進一步抽象出來。簡而言之,Golang在使用操作系統線程方面非常節儉;如果一個goroutine被阻塞了,Go的調度器會在它的位置上切換另一個goroutine,以盡可能地保持線程的忙碌。由于每個CPU核心處理的線程數量有限(而且產生新的線程是很昂貴的),保持這些線程的工作是一件很好的事情。
那么,我們如何使用Golang來并發地進行多個http調用呢?如果你使用過C#或現代JavaScript,你可能使用過async/await來進行多個api調用。Golang并不那么容易,但這都是以效率為名義的。Go總是至少有一個goroutine在運行,它負責運行main()。我們可以在函數調用前用關鍵字go催生新的例程。如果你從事過Java/C#的異步調用,那么goroutine可能會讓你想起上下文的概念。[文章來源:janrs.com] Go Scheduler允許開發者制作成千上萬個這種輕量級的goroutines,并為我們管理每個goroutines所花費的CPU時間。每當一個以go為前綴的函數被執行時,就會創建一個新的goroutine來運行該函數,主goroutine在生成一個新的goroutine后立即繼續前進,直到它遇到一個阻塞操作符(類似于C#或Js中的await)。
讓我們從一個簡單的控制臺應用開始,它調用了幾個GitHub配置文件,并檢查連接是否成功。起初,這里沒有goroutines,所有的調用都是連續進行的,效率不高。
// Auth: janrs.com package main import "fmt" import "net/http" func main() { links := []string{ "https://github.com/fabpot", "https://github.com/andrew", "https://github.com/taylorotwell", "https://github.com/egoist", "https://github.com/HugoGiraudel", } checkUrls(links) } func checkUrls(urls []string) { for _, link := range urls { checkUrl(link) } } func checkUrl(url string) { _, err := http.Get(url) if err != nil { fmt.Println("We could not reach:", url) } else { fmt.Println("Success reaching the website:", url) } }
首先,我們需要添加一個叫做通道的東西。由于在自己的goroutine中運行的Golang函數只是簡單的函數,我們需要一種方法,通過它內部的goroutine可以把它們的結果告訴外部的goroutine;這就是使用通道來實現的。我們通過以下方式初始化它們: c := make(chan string) 我們能夠使用<- 箭頭將結果值發送到我們的通道,我們也可以使用這個箭頭將通道的值分配出去。
第二,我們需要添加一個跟 蹤 器,來跟蹤我們應該期待多少個值從這個通道出來。這可以通過使用sync.WaitGroup.WaitGroup的類型來完成。
落實這兩個想法,代碼如下。
import ( "fmt" "net/http" "sync" ) func main() { links := []string{ "https://github.com/fabpot", "https://github.com/andrew", "https://github.com/taylorotwell", "https://github.com/egoist", "https://github.com/HugoGiraudel", } checkUrls(links) } func checkUrls(urls []string) { c := make(chan string) var wg sync.WaitGroup for _, link := range urls { wg.Add(1) // 這告訴wg,現在這里有一個待處理的操作。 go checkUrl(link, c, &wg) } go func() { wg.Wait() // 這將阻止Goroutine,直到WaitGroup計數器為零。#janrs.com close(c) // 通道需要被關閉,否則下面的循環將永遠持續下去 }() // 這個簡略的循環是一個無休止的循環的語法糖,它只是在等待結果通過'c'通道進入。 for msg := range c { fmt.Println(msg) } } func checkUrl(url string, c chan string, wg *sync.WaitGroup) { defer (*wg).Done() _, err := http.Get(url) if err != nil { c <- "#janrs.com#We could not reach:" + url // 將結果輸入通道 } else { c <- "Success reaching the website:" + url // 將結果輸入通道 } }
關于“GoRoutines高性能同時進行多個Api調用怎么實現”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“GoRoutines高性能同時進行多個Api調用怎么實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。