成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Singleflight優(yōu)化Go代碼

開發(fā) 前端
在本文中,我們了解了Singleflight在優(yōu)化代碼方面的強大功能。不僅僅是處理一個web請求,你還可以將它的用例擴展到其他事情上,比如從數(shù)據(jù)庫中獲取數(shù)據(jù)等等。

介紹

有許多方法可以優(yōu)化代碼以提高效率,減少運行進程就是其中之一。在本文中,我們將看到如何通過使用一個Go包Singleflight來減少重復進程,從而優(yōu)化Go代碼。

問題

假設你有一個web應用,它每秒有10個請求(RPS)。根據(jù)您所知道的數(shù)據(jù),其中一些請求具有相同的模式,實際上可以生成相同的結果,這意味著實際上存在冗余流程。

圖片

從上面的插圖中,我們知道用戶1和用戶2想要相同的東西,但最終,我們(大多數(shù)情況下)分別處理這兩個請求。

解決方案

Singleflight是可以解決這類問題的Go包之一,如文檔中所述,它提供了重復函數(shù)調用抑制機制。

很酷,如果我們知道我們要調用的函數(shù)是重復的,我們就可以減少處理的函數(shù)的數(shù)量,讓我們看看在現(xiàn)實世界中如何使用它。

實現(xiàn)

我們將創(chuàng)建兩個程序,server.go 和 client.go。

server.go — 將作為web服務,可以接收 /api/v1/get_something 的請求,參數(shù)名為name

// server.go

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/api/v1/get_something", func(w http.ResponseWriter, r *http.Request) {
		name := r.URL.Query().Get("name")
		response := processingRequest(name)
		_, _ = fmt.Fprint(w, response)
	})

	err := http.ListenAndServe(":15001", nil)
	if err != nil {
		fmt.Println(err)
	}
}

func processingRequest(name string) string {
	fmt.Println("[DEBUG] processing request..")
	return "Hi there! You requested " + name
}

client.go — 將作為一個客戶端,向web服務發(fā)出5個并發(fā)請求(你可以在變量totalRequests中設置這個數(shù)字)。

// client.go

package main

import (
	"io"
	"log"
	"net/http"
	"sync"
)

func main() {

	var wg sync.WaitGroup

	endpoint := "http://localhost:15001/api/v1/get_something?name=something"
	totalRequests := 5

	for i := 0; i < totalRequests; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			makeAPICall(endpoint)
		}(i)
	}
	wg.Wait()

}

func makeAPICall(endpoint string) {
	resp, err := http.Get(endpoint)
	if err != nil {
		log.Fatalln(err)
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln(err)
	}

	result := string(body)
	log.Printf(result)
}

首先,我們可以運行 server.go,然后繼續(xù)執(zhí)行 client.go。我們將在服務器腳本的終端中看到如下內容:

[DEBUG] processing request.. 
[DEBUG] processing request.. 
[DEBUG] processing request.. 
[DEBUG] processing request.. 
[DEBUG] processing request..

客戶端的輸出是這樣的:

2023/09/05 10:29:34 Hi there! You requested something
2023/09/05 10:29:34 Hi there! You requested something
2023/09/05 10:29:34 Hi there! You requested something
2023/09/05 10:29:34 Hi there! You requested something
2023/09/05 10:29:34 Hi there! You requested something

這是正確的,因為我們從客戶端發(fā)送了五個請求,并在服務器中處理了這五個請求。

現(xiàn)在讓我們在代碼中實現(xiàn)Singleflight,這樣它會更有效率。

// server.go

package main

import (
	"fmt"
	"net/http"

	"golang.org/x/sync/singleflight"
)

var g = singleflight.Group{}

func main() {
	http.HandleFunc("/api/v1/get_something", func(w http.ResponseWriter, r *http.Request) {
		name := r.URL.Query().Get("name")
		response, _, _ := g.Do(name, func() (interface{}, error) {
			result := processingRequest(name)
			return result, nil
		})

		_, _ = fmt.Fprint(w, response)
	})

	err := http.ListenAndServe(":15001", nil)
	if err != nil {
		fmt.Println(err)
	}
}

func processingRequest(name string) string {
	fmt.Println("[DEBUG] processing request..")
	return "Hi there! You requested " + name
}

重新啟動服務器并再次運行客戶端程序后,服務器的終端顯示如下:

[DEBUG] processing request..
[DEBUG] processing request..

客戶端的輸出還是沒有變化:

2023/09/05 10:32:49 Hi there! You requested something
2023/09/05 10:32:49 Hi there! You requested something
2023/09/05 10:32:49 Hi there! You requested something
2023/09/05 10:32:49 Hi there! You requested something
2023/09/05 10:32:49 Hi there! You requested something

太好了!所有客戶端都得到了預期的響應,但是現(xiàn)在我們的服務器只處理了兩個請求。想象一下,如果您處理數(shù)千個類似的請求,您將帶來多大的效率,這是驚人的!

結論

在本文中,我們了解了Singleflight在優(yōu)化代碼方面的強大功能。不僅僅是處理一個web請求,你還可以將它的用例擴展到其他事情上,比如從數(shù)據(jù)庫中獲取數(shù)據(jù)等等。

還有一些我在本文中沒有涉及的內容,例如Singleflight的過程失敗會怎樣,以及我們如何緩存它。

責任編輯:武曉燕 來源: 愛發(fā)白日夢的后端
相關推薦

2022-04-24 15:29:17

微服務go

2021-03-24 06:06:13

Go并發(fā)編程Singlefligh

2021-12-30 18:34:29

緩存GoSinglefligh

2024-10-15 10:00:06

2023-05-10 08:17:22

合并事件推送

2021-07-28 08:53:53

GoGDB調試

2022-06-13 07:03:25

Go 語言怎么優(yōu)化重

2021-07-15 07:23:28

Singlefligh設計

2017-01-19 15:27:24

Android性能優(yōu)化Lint

2021-04-27 06:44:03

PythonCython編程語言

2020-05-06 18:53:23

Go編程語言

2021-08-13 09:06:52

Go高性能優(yōu)化

2024-01-15 11:12:28

Go內存開發(fā)

2020-10-06 18:28:52

gosecGo代碼安全

2021-11-04 05:43:38

GoKartGo代碼靜態(tài)安全分析

2020-11-10 13:42:07

Go編譯器修復

2021-11-08 07:48:48

Go語言對象

2021-06-08 07:45:44

Go語言優(yōu)化

2022-05-16 10:58:12

Go 項目Makefilemake

2021-01-15 05:16:37

Vue3開源代碼量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: aa级毛片毛片免费观看久 | 日韩三区在线观看 | 欧美一级视频免费看 | 99国产精品久久久 | 亚洲第一在线 | 91精品国产91久久久 | 亚洲风情在线观看 | 欧美日韩一区在线 | 伦理二区| 欧洲一区二区在线 | 久久国产日韩 | 亚洲激情在线 | 国户精品久久久久久久久久久不卡 | 另类专区亚洲 | 在线观看a视频 | 一级黄色毛片 | 日韩精品999| 免费观看一级毛片 | 日韩精品一区在线 | 欧美成人aaa级毛片在线视频 | 精品视频一区二区三区在线观看 | av性色全交蜜桃成熟时 | 国产一区h | 在线观看特色大片免费网站 | 成人影视网址 | 欧美高清hd | 免费一区二区三区 | 国产第一页在线播放 | 国产一区二区激情视频 | 欧美日韩一区二区三区视频 | 成年人精品视频 | 久久久入口 | 国内精品久久久久久久影视简单 | 午夜成人在线视频 | 97视频在线观看网站 | 免费国产视频 | 亚洲欧美综合网 | 97色伦网 | 日本不卡一区二区三区 | 国产丝袜一区二区三区免费视频 | 97视频在线观看网站 |