91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GoRoutines高性能同時進行多個Api調用怎么實現

發布時間:2023-03-07 17:30:55 來源:億速云 閱讀:121 作者:iii 欄目:開發技術

這篇文章主要介紹了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調用怎么實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新蔡县| 隆回县| 抚顺县| 卢氏县| 万州区| 屏东市| 南平市| 富民县| 读书| 巴彦淖尔市| 南皮县| 义马市| 柳江县| 宁夏| 崇左市| 伊宁县| 乌什县| 乐都县| 普安县| 平泉县| 邵阳县| 长沙县| 绥化市| 辽阳市| 大足县| 田东县| 河津市| 太原市| 资中县| 荣成市| 海兴县| 黄骅市| 冀州市| 水城县| 青龙| 当雄县| 湄潭县| 东台市| 虎林市| 台南市| 平阴县|