Go 語言并發編程 及 進階與依賴管理

1.0 從并發編程本質了解Go高性能的本質

1.1 Goroutine

協程可以理解為輕量級線程

Go更適合高并發場景原因之一:Go語言一次可以創建上萬協成

“快速”:開多個協成 打印。

go func(): 在函數前加 go 代表 創建協程;

time.Sleep(): 協程阻塞,使主協程 在子協程結束前阻塞不退出

亂序輸出 說明并行

1.2 協程通信 CSP (Communicating Sequential Processes)

通過通信共享內存:Channel通道遵循 先入先出 保證順序

1.3Channel

Channel創建需要通過make()函數;

無緩沖通道也稱 同步通道;有緩沖:緩沖滿了之后要拿走才能存

通過通信共享內存 例子:

M主函數作為消費者 實際中業務比較復雜,所以會 比 生產者AB慢;我們用 帶緩沖的通道 就不會因消費者M的消費速度 影響 生產者的執行效率;

1.4 并發安全Lock

addWithLock() 通過臨界區控制實現;在 每次 x+=1前后加解鎖

addWithOutLock() 沒加鎖; Add 測試函數;對兩種實現做5個協程并發執行

結果為:加鎖時輸出預期結果10000;體現不加鎖的并發安全問題

1.5 WaitGroup實現并發任務的同步

計算器=0表示所有并發任務結束

1.5.1阻塞的優化

好的,以上就是對go并發編程相關概念的介紹,這里簡單做個小結

整個章節主要涉及3個方面,一個是協程,通過高效的調度模型實現高并發操作,一個是通道channel.通過通信實現共享內存;最后svnc相關關鍵字,實現并發安全操作和協程間的同步

2.0 依賴管理

這一章我們主要講解go的依賴管理, 主要涉及go依賴管理的演進路線和go module實踐

依賴指各種開發包

對于hello world以及類似的單體函數只需要依賴原生SDK,而實際工程會相對復雜,我們不可能基于標準庫0~1編碼搭建,而更多的關注業務邏輯的實現,而其他的涉及框架、日志、driver、以及collection等一系列依賴都會通過sdk的方式引入, 這樣對依賴包的管理就顯得尤為重要

2.1 Go依賴管理演進

2.1.1 GoPATH

GOPATH是Go語言支持的一個環境變量,value是Go項目的工作區

目錄有以下結構:

src: 存放Go項目的源碼pkg: 存放編譯的中間產物,加快編譯速度;

bin: 存放Go項目編譯生成的二進制文件

大家想想用gopath依賴管理有 哪些弊端呢?

弊端

如圖,同一個pkg,有2個版本,A-> A0,B-> B0.

而src下只能有1個版本存在,那AB項目無法保證都能編譯通過。 也就是在gopath管理模式下,如果多個項目依賴同一個庫,則依賴該庫是同一份代碼,所以不同項目不能依賴同一個庫的不同版本,這很顯然不能滿足我們的項目依賴需求。為了解決這問題,govender出現了

2.1.2 GoVendor

Vendor是當前項目中的一個目錄,其中存放了當前項目依賴的副本,在Vendor機制下,如果當前項目存在Vendor目錄,會優先使用該目錄下的依賴,如果依賴不存在,會從GOPATH中尋找。 vendor無法很好解決依賴包的版本變動問題和一個項目依賴同一個包的不同版本的問題,下面我們看一個場景

如圖項目A依賴pkg b和c,而B和C依賴了D的不同版本,通過vendor的管理模式我們不能很好的控制對于D的依賴版本,一旦更新項目,有可能帶來依賴沖突。

歸根結底vendor不能清晰的標識依賴的版本概念原因是:他還是依賴源碼

下面,go mod就應運而生了。

2.1.3 Go Module

Go Modules 是Go語言官方推出的依賴管理系統,解決了之前依賴管理系統存在的諸如無法依賴同一個庫的多個版本等問題

G0 module從1.11 開始實驗性引入,1.16 默認開啟;我們一般都讀為go mod,我們也先統一下名稱

2.2 依賴管理三要素

那其實完善的依賴管理一般都需要3要素,這里我們先整體介紹下

這里熟悉java的同學,可以類比下maven

2.3.1 依賴配置-go.mod

首先模塊路徑(依賴管理基本單元)用來標識一個模塊,從模塊路徑可以看出從哪里找到該模塊,如果是github前綴則表示可以從Github 倉庫找到該模塊,依賴包的源代碼由githu托管,如果項目的子包想被單獨引用,則需要通過單獨的go.mod文件進行管理

下面是依賴的原生庫sdk版本(go 1.16)

最下面是單元依賴(最關鍵的部分),每個依賴單元用模塊路徑(跟上面的對應)+版本來唯一標示

2.3.2 依賴配置-version

gopath和govendor都是源碼副本方式依賴,沒有版本規則概念

而gmod為了方便版本管理 定義了版本規則,分為語義化版本和偽版本

其中語義化版本包括三部分,

不同的MAJOR大版本可以表示是不兼容的

所以即使是同一個庫,MAJOR 版本不同也會被認為是不同的模塊

MINOR版本通常是新增函數或功能,需要保持在MAJOR下做到前后兼容 patch 版本一般是修復 bug ;

基于commit的偽版本包括3部分,

版本前綴是和語義化版本一樣的;

時間戳 yyyymmddhhmmss,也就是提交commit的時間,

最后是校驗碼(abcdefabcdef,包含 12 位的哈希前綴;每次提交commit后 Go 會默認生成一個偽版本

2.3.3 依賴配置-非直接依賴indirect

下面我們再來看下依賴單元中的特殊標識符,首先是indirect后綴

表示go.mod對應的當前模塊,沒有直接導入該依賴模塊的包,也就是非直接依賴,標示間接依賴,例如

2.3.4 依賴配置-incompatible

下一個常見是的是incompatible

主版本2+模塊(v2以上) 會在模塊路徑增加/vN(v1,v2這種后綴),這讓gomod按照同的模塊來處理同一個項目不同主版本的依賴(允許不同MAJOR版本間相互兼容)

由于gomod是1.11實驗性引入,所以這項提出之前已經有一些倉庫打上了v2或者更高版本的tag了,為了兼容這部分倉庫,對于沒有go.mod文件并且主版本在2或者以上的依賴,會在版本號后加上+incompatible 后綴

前面講語義化版本提到,對于同一個庫的不同的major版本,需要建立不同的pkg目錄,用不同的gomod文件管理

如下面倉庫為例,V1版本gomod在主目錄下,而對于V2版本,則單獨建立了V2目錄,用另一個gomod文件管理依賴路徑,來表明不同major的不兼容性

那對于有些V2+tag版本的依賴包未遵循這定義規則,就會打上incompatible標志,增加一個compatile的case

依賴圖

答案竟然是B!

Go底層會根據自己的算法 選擇最 低的兼容版本

2.3.5 依賴分發-回源

gomodule的依賴分發,也就是從哪里下載,如何下載的問題

github是比較常見給的代碼托管系統平臺,而Go Modules 系統中定義的依賴,最終可以對應到多版本代碼管理系統中某一項目的特定提交或版本,這樣的話,對于go.mod中定義的依賴,則直接可以從對應倉庫中下載指定軟件依賴,從而完成依賴分發。

但直接使用版本管理倉庫下載依賴,存在多個問題

首先無法保證構建確定:軟件作者可以直接碼平臺增加/修改/刪除 軟件版本,導致下次構建使用另外版本的依賴,或者找不到依賴版本

無法保證依賴可用性:依賴軟件作者可以直接代碼平臺刪除軟件,導致依賴不可用;大幅增加第三方代碼托管平臺壓力

2.3.5 依賴分發-Proxy

而go proxy就是解決這些問題的方案,Go Proxy 是一個服務站點

它會緩存源站中的軟件內容,緩存的軟件版本不會改變,并且在源站軟件刪除之后依然可用,從而實現了供“immutability”和“available”的依賴分發;

使用 Go Proxy 之后,構建時會直接從 Go Proxy 站點拉取依賴

類比項目中,如果下游無法滿足我們上游的需求、接口,我們可以建一層適配器或Proxy解決

2.3.6 依賴分發-變量-GOPROXY

下面講一下go proxy的使用,Go Modules通過GOPROXY環境變量控制如何使用 Go Proxy;GOPROXY是一個Proxy 站點URL列表,可以使用 “direct”表示源站 用逗號分隔

對于示例配置,整體的依賴尋址路徑,會優先從proxy1下載依賴,如果proxy1不存在,后下鉆proxy2尋找,如果proxy2,中不存在則會回源到源站直接下載依賴,緩存到proxy站點中。

2.3.7 工具-go get

對go module的管理工具介紹下使用,首先是go get

2.3.8 工具-go mod

go mod,盡量提交之前執行下go tidy,減少構建時無效依賴包的拉取

非常感謝您閱讀到這里,如果這篇文章對您有幫助,希望能留下您的點贊👍 關注💖 收藏 💕評論💬感謝支持!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37359.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于深度信念網絡的西儲大學軸承故障分類識別,基于EMD+DBN的西儲大學軸承故障識別,LCD+DBN,LMD+DBN

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) (EMD,LCD,LMD)+DBN的深度信念網絡的西儲大學軸承故障分類識別 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類…

Nacos使用SpringCloudAlibaba+Dubbo實現

Nacos簡介 Nacos是阿里的一個開源產品,它是針對微服務架構中的服務發現、服務治理、配置管理的綜合型解決方案。 官方介紹是這樣的: Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現動態服務發現、…

CSDN編程題-每日一練(2023-08-14)

CSDN編程題-每日一練(2023-08-14) 一、題目名稱:小股炒股二、題目名稱:王子闖閘門三、題目名稱:圓小藝 一、題目名稱:小股炒股 時間限制:1000ms內存限制:256M 題目描述: …

Linux學習之防火墻概述

防火墻分類: 軟件防火墻:常用于數據包的過濾,比如限制某些ip或者端口,進行某些數據的轉發或者傳送 硬件防火墻:防御地域攻擊 軟件防火墻的分類: 包過濾防火墻:控制比較寬泛,防御效果…

ISIS技術(第三十七課)

1 分享一下華為官網上的一張地圖 官網地址:https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967&id=ZH-CN_CONCEPT_0000001501534705 2 路由的分類 -直連路由 直接連接的路由,且配置了IP地址之后(在同一網段內),就是直連路由。 -非直連路由 -靜態路由…

Shell命令之eval命令

1、基本作用 二次執行命令 2、基本格式 eval command-line3、例如 以下命令無法執行 pipe"|" ls $pipe wc -l ls: -l: No such file or directory ls: wc: No such file or directory ls: |: No such file or directory以下命令可以執行 eval ls $pipe wc -lSh…

Apache Dubbo概述

一、課程目標 1. 【了解】軟件架構的演進過程 2. 【理解】什么是RPC 3. 【掌握】Dubbo架構 4. 【理解】注冊中心Zookeeper 5. 【掌握】Zookeeper的安裝和使用 6. 【掌握】Dubbo入門程序 7. 【掌握】Dubbo管理控制臺的安裝和使用 8. 【理解】Dubbo配置二、分布式RPC框架Apache …

2021年06月 C/C++(二級)真題解析#中國電子學會#全國青少年軟件編程等級考試

第1題:數字放大 給定一個整數序列以及放大倍數x,將序列中每個整數放大x倍后輸出。 時間限制:1000 內存限制:65536 輸入 包含三行: 第一行為N,表示整數序列的長度(N ≤ 100); 第二行為N個整數(不超過整型范圍…

(css)點擊前隱藏icon圖表 點擊后顯示

(css)點擊前隱藏icon圖表 點擊后顯示 效果 html <liv-for"(item,index) in sessionList":key"index"class"liClass":class"{ active: change2 index }"tabindex"2">...<el-tooltip class"item" effec…

c++病毒/惡搞代碼大全( 下 )

注&#xff1a;以下代碼應勿用于非法&#xff08;Dev-c5.11實測可用&#xff09; 警告:以下為危險/永久性程序&#xff0c;請慎重使用 8. 效果:禁用任務管理器 提示:可能被殺毒軟件攔截 #include <stdio.h> #include <windows.h> int main() {HKEY hkey;DWORD …

Neo4j之OPTIONAL MATCH基礎

OPTIONAL MATCH 是 Neo4j 查詢語言 Cypher 中的一種關鍵字&#xff0c;用于在查詢中執行可選的模式匹配。它允許你在匹配節點和關系的過程中&#xff0c;即使匹配失敗也不影響整個查詢結果。OPTIONAL MATCH 允許你查找與指定模式匹配的數據&#xff0c;如果匹配失敗&#xff0c…

分布式監控平臺——Zabbix

市場上常用的監控軟件&#xff1a; 傳統運維&#xff1a;zabbix、 Nagios 一、zabbix概述 作為一個運維&#xff0c;需要會使用監控系統查看服務器狀態以及網站流量指標&#xff0c;利用監控系統的數據去了解上線發布的結果&#xff0c;和網站的健康狀態。 利用一個優秀的監…

Dedecms V110最新版RCE---Tricks

前言 剛發現Dedecms更新了發布版本&#xff0c;順便測試一下之前的day有沒有修復&#xff0c;突然想到了新的tricks去實現RCE。 文章發布的時候估計比較晚了&#xff0c;一直沒時間寫了。 利用 /uploads/dede/article_string_mix.php /uploads/dede/article_template_rand.…

Blender增強現實3D模型制作指南【AR】

推薦&#xff1a;用 NSDT編輯器 快速搭建可編程3D場景 將靜態和動畫 3D 內容集成到移動增強現實 (AR) 體驗中是增強用戶沉浸感和參與度的高效方法。 然而&#xff0c;為 AR 創建 3D 對象可能相當艱巨&#xff0c;尤其是對于那些缺乏 3D 建模經驗的人來說。 與添加視頻或照片 AR…

黑馬項目一階段面試58題 蒼穹外賣具體技術細節9題

一、Nginx的作用 1.反向代理 前端把請求發送給nginx&#xff0c;再由nginx將請求發送給后端服務器。 2.負載均衡 提高訪問速度&#xff1b;進行負載均衡&#xff1b;保證后端服務安全 二、Swagger有什么作用 直接調試后端請求響應 三、Redis常見數據類型 String、Hash、L…

flutter 解壓 zip 中文亂碼問題處理

前言 很簡單的一個 zip 包解壓縮的功能&#xff0c;但是 windows 平臺中文顯示亂碼&#xff0c;很糟心&#xff0c;搜了一圈沒找到現成的方法&#xff0c;在此貼上我的解決方式。 實現 導入需要的包 flutter pub add archiveflutter pub add fast_gbkflutter pub add path代…

THUDM/chatglm2-6b-int4體驗

在gpu下 gpu&#xff1a; Telsa T4 資源消耗&#xff1a;RAM大概4G&#xff0c;GPU顯存大概6G # 安裝transformers等包 !pip install protobuf transformers4.30.2 cpm_kernels torch>2.0 gradio mdtex2html sentencepiece accelerate# 導入AutoTokenizer, AutoModel from…

CSAPP Lec01

1. CMU 15213_15513 CSAPP 深入理解計算機系統 Lecture 01 Course Overview 中英字幕_嗶哩嗶哩_bilibili 從這個課程中可以學到什么&#xff1f;&#xff08;為什么要學這門課&#xff09; Great Reality #1&#xff08;數字類型&#xff09;: Ints are not Integers, Floats…

idea打jar包

目錄 1、打包設置 2、打包介紹 3、開始打包 1、打包設置 先設置要打包的模塊信息&#xff0c;即打包進去的內容。如下圖所示&#xff1a;File --> Project Structure --> Artifacts&#xff0c;點擊&#xff0b;號完成模塊創建&#xff0c;其中有兩種方式&#xff1a;…

《零基礎實踐深度學習》(第2版)學習筆記,(二)機器學習和深度學習綜述

文章目錄 1. 人工智能、機器學習、深度學習的關系2. 機器學習2.1 實現原理2.2 如何實施 3. 深度學習神經網絡核心概念 1. 人工智能、機器學習、深度學習的關系 **人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;**是研發用于模擬、延伸和擴展人的智能…