11 Goroutine-并發與并行、阻塞與非阻塞

并發

順序執行:按照事先計劃好的順序,執行完一個操作后,再執行下一個操作。

順序執行效率不高的原因:

  • 每個操作由多個步驟組成,每個步驟所需要的時間長短不一,有些步驟可能相當耗時。
  • 顧客點菜需要時間,后廚做菜也需要時間,可否利用這些時間為更多顧客提供服務呢。

優化目標:減少不必要的閑置和等待,最大化處理機時間,提高工作效率

  • 當一個操作執行到某個相當耗時的步驟時,轉而執行其它操作中相對不太耗時的步驟。
  • 待這些非耗時步驟完成后,之前那個耗時的步驟也完成了,再繼續回到前一個操作中。

并發執行:沒有固定的執行順序,不等一個操作執行完,即開始下一個操作

并發與并行

并發一個行為主體同時執行多個操作。

并行多個行為主體同時執行多個操作。

瀏覽器中的并發

啟用瀏覽器開發人員工具,打開任意可訪問頁面,可以看到瀏覽器并不是依次發出每一個請求,而是同時發出很多請求,以盡快渲染頁面的每個組成部分。這樣做的好處是頁面的整體加載速度在用戶看來非常之快。

阻塞與非阻塞

在實際編程中,有些函數的執行速度很,對于調用者而言幾乎瞬間就返回了,這樣的函數稱為非阻塞函數。

但另一些函數的執行速度則可能非常緩,在調用者看來從調用到返回需要經歷非常漫長的等待,甚至可能是永久的等待,這樣的函數稱為阻塞函數。

  • 在順序模式中,阻塞的操作會導致其后的操作長期永遠得不到執行,降低程序的性能。
  • 在并發模式中,阻塞的操作會和其它操作分屬于不同的執行過程,快不必等慢,高性能。
// 順序執行
// 在順序模式中,阻塞的操作過程會導致其后的操作永遠或長期得不到執行,降低程序的性能
package main
import ("fmt""time"
)
func proc(ch rune, ms time.Duration) {for {	// 死循環,模擬阻塞fmt.Printf("%c", ch)time.Sleep(ms * time.Millisecond)}
}
func main() {proc('-', 100)proc('+', 500)
}
// 打印輸出:
// -------------------------

通過goroutine并發處理

Go語言通過Goroutine處理并發,為了使某個函數在獨立的"線程"中執行,只需在調用該函數的時候使用關鍵字go。

  • go proc('-', 100)

將任何阻塞函數放在關鍵字go的后面執行:

  • 立即啟動一個獨立的"子線程",并在該"子線程"中執行阻塞函數中的代碼。
  • 與此同時"父線程"從go中立即返回,并不等待阻塞函數返回,即"子線程"結束。
  • "父線程"在"子線程"執行阻塞函數的同時,執行該語句下面的操作。
  • go下面的操作和go后面的函數分別運行在父子兩個獨立"線程"中。
  • 阻塞函數執行完畢返回,"子線程"結束。
// 并發執行
// 在并發模式中,阻塞的操作過程運行于獨立的"線程"之中,不會影響其它操作的執行,提高了程序的性能
package main
import ("fmt""time"
)
func proc(ch rune, ms time.Duration) {for {fmt.Printf("%c", ch)time.Sleep(ms * time.Millisecond)}
}
func main() {go proc('-', 100) // 每100ms,打印-proc('+', 500)		// 每500ms,打印+
}
// 打印輸出:
// +-----+-----+-----+-----+ 

Goroutine與線程

Goroutine常被稱作輕量級線程邏輯線程,它和真正的線程還是有區別的。

線程

Goroutine

調度

開銷

線程由操作系統內核調度,每隔幾毫秒,會有一個硬件時鐘中斷發送到CPU,CPU會調用一個調度器內核函數。該函數暫停當前正在運行的線程,把它的寄存器信息保存到內存中,查看線程列表并決定接下來運行哪一個線程,再從內存中恢復此線程的寄存器信息并執行之。這種線程調度需要一個完整的上下文切換,即保存一個線程的狀態到內存,再從內存恢復另一個線程的狀態,同時還要不斷更新調度器的數據結構。某種意義上講,這種操作還是相當耗時的。

Go語言程序運行時自帶一個調度器,這個調度器使用一個稱為一個M:N的調度技術,即將M個Goroutine調度到N個線程中,Go的調度器不由硬件時鐘定期觸發,而由特定的Go語言結構觸發,也不需要在用戶態和內核態之間來回切換,所以調度一個Goroutine比調度一個線程的開銷要小得多。

棧空間

每個線程都有一個固定大小的棧內存,通常是2M字節,棧內存用于保存函數的參數、局部變量和返回地址。

Goroutine的棧內存是動態的,開始只有2K字節,而后隨著程序的運行,再根據實際需要增大或縮小,最大可以到1G字節。

線程

標識

在大部分支持線程的操作系統中,每個線程都有一個唯一標識,通常是一個整數或者結構體,通過該標識可以為每個線程創建獨立的全局存儲空間,謂之線程局部存儲。

Goroutine沒有提供可被程序員訪問的唯一標識,它是一種純函數的理念。Go語言認為線程局部存儲的濫用會導致一種不健康的超距作用,即函數的行為不僅取決于它的參數,還與執行它的線程有關。

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

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

相關文章

VectorDBBench在windows的調試

VectorDBBench在windows的調試 VectorDBBench是一款向量數據庫基準測試工具,支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等,可以測試其QPS、時延、recall。 VectorDBBench是一款使用python編寫的…

輕松學EntityFramework Core--Entity Framework Core 簡介

一、什么是Entity Framework Core Entity Framework Core(簡稱EF Core)是一個現代的、跨平臺的、開源的ORM(對象關系映射)框架,由微軟開發。它允許.NET開發者通過.NET對象與關系型數據庫進行交互,而無需編…

putty中的plink.exe功能和用法

plink對于自動化的執行命令和工作非常有好處。plink可以讓我們直接在命令行制定好命令,然后執行,完成后自動關閉session。 Plink: command-line connection utility Release 0.81 Usage: plink [options] [user]host [command]("host" can al…

2024年150道高頻Java面試題(七十四)

147. 如何在 MyBatis 中實現一對多和多對一的關系映射&#xff1f; 在 MyBatis 中實現一對多&#xff08;One-to-Many&#xff09;和多對一&#xff08;Many-to-One&#xff09;的關系映射&#xff0c;主要是通過 <resultMap> 元素中的 <collection> 和 <assoc…

深度學習模型在OCR中的可解釋性問題與提升探討

摘要&#xff1a; 隨著深度學習技術在光學字符識別&#xff08;OCR&#xff09;領域的廣泛應用&#xff0c;人們對深度學習模型的可解釋性問題日益關注。本文將探討OCR中深度學習模型的可解釋性概念及其作用&#xff0c;以及如何提高可解釋性&#xff0c;使其在實際應用中更可…

在Linux系統上使用Nginx的詳解指南

目錄 簡介 準備工作 安裝Nginx 通過包管理器安裝 源碼編譯安裝 Nginx基礎配置 主配置文件nginx.conf詳解 基本服務器塊配置 SSL/TLS配置 動靜分離 反向代理配置 負載均衡配置 常見問題及解決方法 結論 1. 簡介 Nginx是一款高性能HTTP和反向代理服務器&#xff…

上位機圖像處理和嵌入式模塊部署(f103 mcu唯一的id)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 對于stm32f103系列mcu來說,一般每一顆原廠的mcu,都會對應一個唯一的id。那這個id可以用來做什么用呢?個人認為,可以用來做激活使用。舉個例子,第一次mcu模塊使用的時候,一般可…

Java 零基礎入門學習(小白也能看懂!)

&#x1f4da;博客主頁&#xff1a;愛敲代碼的小楊. ?專欄&#xff1a;《Java SE語法》 | 《數據結構與算法》 | 《C生萬物》 |《MySQL探索之旅》 |《Web世界探險家》 ??感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;&#xff0c;您的三連就是我持續更…

第16篇:JTAG UART IP應用<三>

Q&#xff1a;如何通過HAL API函數庫訪問JTAG UART&#xff1f; A&#xff1a;Quartus硬件工程以及Platform Designer系統也和第一個Nios II工程--Hello_World的Quartus硬件工程一樣。 Nios II軟件工程對應的C程序調用HAL API函數&#xff0c;如open用于打開和創建文件&#…

前端最新面試題(ES6模塊篇)

目錄 1 ES5、ES6和ES2015有什么區別? 2 babel是什么,有什么作用? 3 let有什么用,有了var為什么還要用let? 4 舉一些ES6對String字符串類型做的常用升級優化? 5 舉一些ES6對Array數組類型做的常用升級優化 6 舉一些ES6對Number數字類型做的常用升級優化 7 舉一些ES…

前端基礎入門三大核心之JS篇:JavaScript,不只是咖啡因那么簡單!—— 進階案例集錦篇

前端基礎入門三大核心之JS篇&#xff1a;解鎖JavaScript的魔法密鑰—— 進階案例集錦 &#x1f9d9; 基礎概念與作用&#xff1a;JS&#xff0c;不僅僅是“腳本”&#x1f4da; 變量聲明的進化史 &#x1f50d; 多維度功能使用&#xff1a;函數、數組與對象&#x1f916; 函數&…

前后端聯調小細節

前端向后端發數據&#xff0c;有時候前端和后端的字段是一樣的&#xff0c;字段沒有問題&#xff0c;前端發過來的載荷也沒有問題&#xff0c;但后端接收到的字段是null的&#xff0c;這時候可以排查前端發過來的數據是不是多嵌套了一層&#xff0c;比如發過來的是。 實例如下…

使用YOLOv9訓練和測試自己的數據集

任務&#xff1a;檢測舌頭上的裂紋和齒痕 已經有了labelme標注的數據集&#xff0c;并且轉為了coco格式 參考&#xff1a; 詳細&#xff01;正確&#xff01;COCO數據集&#xff08;.json&#xff09;訓練格式轉換成YOLO格式&#xff08;.txt&#xff09;_coco數據集的train…

服務器數據恢復—服務器raid常見故障表現原因解決方案

RAID&#xff08;磁盤陣列&#xff09;是一種將多塊物理硬盤整合成一個虛擬存儲的技術&#xff0c;raid模塊相當于一個存儲管理的中間層&#xff0c;上層接收并執行操作系統及文件系統的數據讀寫指令&#xff0c;下層管理數據在各個物理硬盤上的存儲及讀寫。相對于單獨的物理硬…

2023年全國青少年人工智能創新挑戰賽真題

為了大家備考2024年第七屆全國青少年人工智能創新挑戰賽&#xff0c;今天分享2023年第6屆全國青少年人工智能創新挑戰賽C信息學專項真題&#xff0c;圖形化編程及Python編程基本大同小異&#xff0c;參考6547網的Python及圖形化編程題庫。 一、單項選擇題(共 15 題,每題 2 分,共…

jpom linux發布前端 ruoyi

前置條件 輔助安裝 一鍵安裝maven curl -fsSL https://jpom.top/docs/install.sh | bash -s Server mvnonly-moduledefault 一鍵安裝node curl -fsSL https://jpom.top/docs/install.sh | bash -s Server mvnonly-moduledefault 服務下載啟動 下載安裝 安裝服務 安裝服…

vscode中使用conda虛擬環境

每一次配置環境&#xff0c;真的巨煩&#xff0c;網上的資料一堆還得一個個嘗試&#xff0c;遂進行整理 1.準備安裝好Anaconda 附帶一篇測試教程&#xff0c;安裝anaconda 2.準備安裝vscode 安裝地址&#xff1a;Visual Studio Code 3.創建Conda環境 搜索框搜索Anaconda…

位運算符——原碼-反碼-補碼(重點 難點)【二進制在運算中的說明】

如果連二進制的知識還沒搞懂, 那么計算機最基礎的你都還沒明白, 所以2進制對我們程序員來說, 是必會, 必學的知識 二進制在運算中的說明: 一. 二進制是逢2進位的進位制, 0,1是基本算符 二. 現代的電子計算機技術全部采用的是二進制, 因為它只使用0, 1兩個數字符號,非常簡單…

Nginx添加訪問密碼

安裝密碼生成工具 yum -y install httpd-tools生成用戶和密碼文件 [rootlocalhost nginx]# htpasswd -c /usr/local/nginx/password web01 New password: 這里輸入密碼 Re-type new password: 再次輸入密碼 Adding password for user web01參數說明&#xff1a; web01 是自定…

文章解讀與仿真程序復現思路——電力自動化設備EI\CSCD\北大核心《計及液態空氣儲能與綜合需求響應的綜合能源系統低碳經濟調度》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…