Go 協程基礎:輕松入門并發編程,解析 Goroutines 的奧秘

一、協程基本使用

1、啟動一個協程
  • 主線程中每個100毫秒打印一次,總共打印2次
  • 另外開啟一個協程,打印10次
  • 情況一:打印是交替,證明是并行的
  • 情況二:開啟的協程打印2次,就退出了(因為主線程退出了)
package mainimport ("fmt""time"
)func test() {for i :=o;i<10;i++ {fmt.PrintIn("test() 你好golang")time.Sleep(time.Millisecond * 100)}
}func main() {go test()    //表示開啟一個協程for i:=0;i<2;i++ {fmt.PrintIn("main() 你好golang")time.Sleep(time.Millisecond * 100)}
}
/*
main() 你好golang
test() 你好golang
main() 你好golang
test() 你好golang
test() 你好golang
*/
?2、WaitGroup等待協程執行完畢
  • 主線程退出后所有的協程無論有沒有執行完畢都會退出
  • 所以我們在主進程中可以通過WaitGroup等待協程執行完畢
    • sync.WaitGroup內部維護者一個計數器,計數器的值可以增加和減少
    • 例如當我們啟動了N個并發任務時,就將計數器值增加N
    • 每個任務完成時通過調用Done()方法將計數器減1
    • 通過調用Wait來等待并發任務執行完,當計數器值為0時,表示所有并發任務已經完成

var wg sync.waitGroup? ? ? //第一步:定義一個計數器

wg.Add(1)? ? ? ? ? ? ? ? ? ? ? ? //第二步:開啟一個協程計數器+1

wg.Done()? ? ? ? ? ? ? ? ? ? ? ? //第三步:協程執行完畢,計數器-1

wg.Wait()? ? ? ? ? ? ? ? ? ? ? ? //第四步:計數器為0時退出

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroup         //第一步:定義一個計數器func  test1() {for i :=0;i<10;i++ {fmt.PrintIn("test1() 你好golang",i)time.Sleep(time.Millisecond * 100)}wg.Done()    //協程計數器-1    //第三步:協程執行玩不,計數器-1
}func  test2() {for i :=0;i<2;i++ {fmt.PrintIn("test2() 你好golang",i)time.Sleep(time.Millisecond * 100)}wg.Done()    //協程計數器-1   
}func main() {wg.Add(1)    //協程計數器+1     第二不:開啟一個協程計數器+1go test1()    //表示開啟一個協程wg.Add(1)    //協程計數器+1go test2()    //表示開啟一個協程wg.Wait()    //等待協程執行完畢... 第四步:計數器為0時退出fmt.PrintIn("主線程退出...")}/*
test2() 你好golang- 0
test1() 你好golang- 0
.....
test1() 你好golang- 8
test1() 你好golang- 9
主線程退出...
*/

?二、多協程案例

1、開啟多個協程
  • 在Go語言中實現并發就是這樣簡單,我們還可以啟動多個goroutine
  • 這里使用了sync.WaitGroup來實現等待goroutine執行完畢
  • 多次執行上面的代碼,會發現每次打印的數字的順序都不一致
  • 這是因為10個goroutine是并發執行的,而goroutine的調度是隨機的
package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc hello(i int){defer wg.Done()    //goroutine結束就登記-1fmt.PrintIn("Hello Goroutine!",i)
}func main() {for i :=0;i<10;i++ {wg.Add(1)    //啟動一個goroutine就登記+1go hello(i)}wg.Wait()    //等待所有登記的goroutine都結束
}
2、多協程統計素數
  • 需求:要統計1-120000的數字中哪些是素數?goroutine for循環實現
  • 協程?統計 1-30000
  • 協程 統計 30001-60000
  • ?協程 統計 60001-90000

  • 協程 統計 90001-120000

  • start:(n-1)*30000+1 end:n*30000

package main
import ("fmt""sync""time"
)
var wg sync.WaitGroupfunc test(n int) {for num := (n-1)*30000 + 1; num < n*30000; num++ {if num > 1 {var flag = truefor i := 2; i < num; i++ {if num%i == 0 {flag = falsebreak}}if flag {fmt.Println(num, "是素數")}}}wg.Done()
}func main() {start := time.Now().Unix()for i := 1; i <= 4; i++ {wg.Add(1)go test(i)}wg.Wait()fmt.Println("執行完畢")end := time.Now().Unix()fmt.Println(end - start) //1毫秒
}

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

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

相關文章

做題筆記:SQL Sever 方式做牛客SQL的題目--SQL157

----SQL157 平均播放進度大于60%的視頻類別 計算各類視頻的平均播放進度&#xff0c;將進度大于60%的類別輸出。 注&#xff1a; 播放進度播放時長視頻時長*100%&#xff0c;當播放時長大于視頻時長時&#xff0c;播放進度均記為100%。 結果保留兩位小數&#xff0c;并按播放進…

基于ssm的學生公寓管理中心系統的設計與實現論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本學生公寓管理中心系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據…

[報錯]記錄IDEA遠程開發報錯:java: Cannot run program.....

報錯內容 IDEA在進行遠程開發的時候報錯&#xff0c;內容如下&#xff1a; java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

redis主從復制【面試必看】

在分布式系統中&#xff0c;希望使用多個服務器來部署redis&#xff0c;存在以下幾種redis的部署方式 主從模式主從哨兵集群模式 主從模式 在若干個redis節點中&#xff0c;有的是主節點&#xff0c;有的是從節點 假設有三個物理服務器&#xff08;稱為是三個節點&#xff…

(JSP)EL——優化登錄界面,獲取對象,獲取數據

EL優化登錄界面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"reques…

生產工序(oj題)

很有趣的一道題 關鍵在于固定工序的整合 看樣例是固定工序中間是不能插入其他工序的&#xff08;也不講清楚&#xff09;&#xff0c;如果可以的話&#xff0c;只能說可能會更麻煩 注意固定工序是按照固定工序中的第一個工序進行排序的 整合完之后&#xff0c;就是遞歸列出…

Java中的IO流①——IO流的體系、字節流、try...catch異常處理

概述 IO流的分類 IO流的體系 這四個類都是抽象類&#xff0c;所以需要實現類對象才能使用---> 字節流 FileInputStream--> 書寫細節 代碼示范 此時文件a.txt內容為abcde 使用char強轉和read方法調用五次read方法--> public static void main(String[] args) throws IO…

mysql 語言學習

整理了一下 mysql 操作語言&#xff0c;不是很全&#xff0c;部分地方也許需要修改&#xff0c;先放上來&#xff0c;有時間再慢慢完善。 一、數據庫操作 連接數據庫 $ sudo mysql [-h ip] -u root -p [-P 3306] 初始化數據庫 $ mysql_secure_installation備份數據庫 # 備…

初出茅廬的小李博客之TobudOS移植到EVB_AIoT開發板

本博客參考教程&#xff1a; https://atomgit.com/OpenAtomFoundation/TobudOS/blob/master/doc/TobudOS_EVB_AIoT_STM32_Guide.md 介紹一下EVB_AIoT開發板 這個開發板是由TobudOS開源社區聯合意法半導體、南京厚德物聯網設計的一款高性能IoT開發平臺&#xff0c;主控芯片是S…

SystemVerilog學習(0)——目錄與傳送門

一、驗證導論 SystemVerilog學習&#xff08;1&#xff09;——驗證導論-CSDN博客文章瀏覽閱讀403次。SystemVerilog自學&#xff0c;驗證系統概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、數據類型 SystemVerilog學習&…

含掩膜mask的單通道灰度圖轉化為COCO數據集格式標簽的json文件(python)

輸入&#xff1a;單通道的灰度圖&#xff0c;灰度圖內含掩膜mask 目標&#xff1a;把灰度圖中的語義mask轉換為COCO數據集格式的json文件 輸出&#xff1a;COCO數據集格式的json文件 期間遇到的問題&#xff1a; 發現有的掩膜內部存在其他類別的掩膜&#xff0c;即mask內部還套…

枚舉類簡單使用

1、創建一個枚舉 public enum DemoEnum {// 引號里面存放的是下面所創建的屬性&#xff0c;如果不創建屬性則不能輸入引號里的值的NORMAL("正常"),DESTORY("廢棄");private String label;private DemoEnum(String label){this.label label;}public Strin…

使用.net core MVC實現圖片上傳下載

今天閑來無事&#xff0c;復習復習 1、上傳 上傳界面 <div class"text-center"><h1 class"display-4">Welcome</h1><form method"post" enctype"multipart/form-data" asp-controller"Home" asp-ac…

<HarmonyOS主題課>三方庫【課后考核】

【習題】三方庫 判斷題 三方組件是開發者在系統能力的基礎上進行了一層具體功能的封裝&#xff0c;對其能力進行拓展的工具 。 正確(True) 可以通過ohpm uninstall 指令下載指定的三方庫 錯誤(False) lottie使用loadAnimation方法加載動畫。 正確(True) 單選題 通過ohpm安…

@FunctionalInterface、Lambda表達式和方法引用

知識不回顧是會被遺忘的&#xff01; 網上看了一些相關文章&#xff0c;這里記錄一下&#xff0c;僅供參考 Java語言從JDK1.8開始引入了函數式編程。 函數式編程的核心特點是&#xff0c;函數作為一段功能代碼&#xff0c;可以像變量一樣進行引用和傳遞&#xff0c;以便在有需…

stm32 使用18B20 測試溫度

用18b20 測試溫度是非常常用的&#xff0c;不過18B20的調試不是這么容易的&#xff0c;有些內容網上很多的&#xff0c;不再重復說了&#xff0c;我先把波形說一下&#xff0c;再說程序部分&#xff1a; 整個都溫度數據的順序是&#xff1a; 1.700uS的低電平復位并測試18B20的…

【素書學習】人生境界的四個層次

馮友蘭先生認為人生境界有四個層次&#xff1a; 1、自然境界。總是依照社會習慣或本性而為&#xff0c;完全隨天地運轉而運轉&#xff0c;無明了的目的&#xff0c;不明所做的意義。日出而作&#xff0c;日落而息&#xff0c;不會去過多地思考此外的事情。不知何為苦、何為樂&…

mfc110u.dll丟失的解決方法,mfc110u.dll丟失原因是什么?

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“mfc110u.dll文件丟失”。那么&#xff0c;mfc110u.dll是什么&#xff1f;為什么會出現丟失的情況呢&#xff1f;本文將為您詳細介紹mfc110u.dll文件的含義、丟失原因以及解決方法。 首先&…

MyBatis進階之結果集映射注解版

文章目錄 注解實現結果集映射注解實現關系映射常用功能注解匯總 注解實現結果集映射 注意 配置結果集映射&#xff0c;只用看 SQL 執行結果&#xff0c;不看 SQL 語句&#xff01; 注意 由于注解在映射結果集上沒有實現 <resultMap> 的 100% 功能&#xff0c;因此&#x…

LeetCode763. Partition Labels

文章目錄 一、題目二、題解 一、題目 You are given a string s. We want to partition the string into as many parts as possible so that each letter appears in at most one part. Note that the partition is done so that after concatenating all the parts in orde…