golang 協程 如何中斷和恢復

Go語言通知協程退出(取消)的幾種方式 - 知乎

GoLang之goroutine底層系列二(goroutine的創建、讓出、恢復)_golang goroutine-CSDN博客

在 Go 語言中,協程(也稱為 goroutine)是通過?go?關鍵字啟動的輕量級線程。由于 goroutine 的調度是由 Go 運行時管理的,直接停止一個正在執行的 goroutine 是不可能的,這與操作系統線程不同。但是,你可以通過一些策略來實現“中斷”和“恢復”的行為,盡管這不是傳統意義上的停止和恢復。

1. 使用通道(Channel)進行信號傳遞

最常用的方法是使用通道(channel)來安全地中斷 goroutine。你可以在另一個 goroutine 中向該 goroutine 發送一個信號(例如,一個特殊的值或者一個結構體),然后在被中斷的 goroutine 中定期檢查這個通道以決定是否退出循環或函數。

package mainimport ("fmt""time"
)func worker(done chan bool) {for {select {case <-done:fmt.Println("Worker stopped.")return // 退出函數,結束 goroutinedefault:fmt.Println("Working...")time.Sleep(500 * time.Millisecond) // 模擬工作}}
}func main() {done := make(chan bool)go worker(done)time.Sleep(2 * time.Second) // 等待一段時間done <- true               // 發送信號到 worker,要求它停止time.Sleep(1 * time.Second) // 等待 worker 完全停止
}

2. 使用 context 包

context?包是 Go 標準庫中處理請求范圍的值、取消信號和截止時間的標準方式。它非常適合用來控制 goroutine 的生命周期。

示例代碼:

package mainimport ("context""fmt""time"
)func worker(ctx context.Context) {for {select {case <-ctx.Done(): // 當 ctx 被取消時,這里會被觸發fmt.Println("Worker stopped.")return // 退出函數,結束 goroutinedefault:fmt.Println("Working...")time.Sleep(500 * time.Millisecond) // 模擬工作}}
}func main() {ctx, cancel := context.WithCancel(context.Background())go worker(ctx)time.Sleep(2 * time.Second) // 等待一段時間cancel()                    // 取消 context,要求 worker 停止time.Sleep(1 * time.Second) // 等待 worker 完全停止
}

3. 使用 sync.Once 或 sync.Mutex 控制退出邏輯的執行一次

如果你需要在某些情況下只安全地執行退出邏輯一次,可以使用?sync.Once?來確保。這對于確保資源清理代碼只運行一次非常有用。但是,這種方法更多地是關于如何安全地執行退出邏輯,而不是真正地“中斷”一個正在執行的 goroutine。

示例代碼:

package mainimport ("fmt""sync""time"
)var once sync.Once
var running = true // 控制循環是否繼續運行的標志位func worker() {for running { // 使用 running 作為循環條件來控制何時退出循環體中的代碼塊。fmt.Println("Working...")time.Sleep(500 * time.Millisecond) // 模擬工作}
}func stopWorker() { // 安全地停止 worker 的函數。使用 sync.Once 確保只調用一次。once.Do(func() { // 使用 sync.Once 來確保這個操作只執行一次。running = false // 設置 running 為 false,讓循環在下次迭代時退出。})
}

在上面的代碼中,你可以通過調用?stopWorker()?來停止?worker()?函數。但是,這種方法更多地是控制何時退出循環而不是真正地“中斷”一個正在執行的 goroutine。在實踐中,通常推薦使用通道或 context 來管理 goroutine 的生命周期。

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

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

相關文章

ARMv8 創建3級頁表示例

最近在研究arm v8頁表創建過程&#xff0c;順帶做了一個如下形式的頁表&#xff0c; // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

遷港戰平 精神可勝國足

遷港戰平可勝國足 江蘇省城市足球聯賽第6輪&#xff0c;宿遷隊主場迎戰連云港隊。比賽中&#xff0c;宿遷隊由張棟和高馳各入一球&#xff0c;連云港隊則憑借穆家鑫與李團杰的進球連扳兩城。最終雙方以2比2握手言和。 第38分鐘&#xff0c;張棟角球進攻中無人盯防推射破門&…

408第三季part2 - 計算機網絡 - ip分布首部格式與分片

理解 好好看一下這個圖 每行是4B&#xff0c;首部也不一定是20B&#xff0c;還有可選字段&#xff0c;可以變的更大 然后我們先看一下概念 然后這個生存時間每路過一個路由器就會扣1滴血 比如一開始是13&#xff0c;經過r1r2r3到B會變成10 但如果是2&#xff0c;經過第二個路…

詳解String類不可變的底層原理

String類 String的基本特性 不可變性: String 對象一旦創建就不能被修改&#xff0c;所有看似修改的操作實際上都是創建新的 String 對象final類: String 類被聲明為 final&#xff0c;不能被繼承基于字符數組: 內部使用final char value[]存儲字符數據(Java9以后改為byte[] …

GIT: 一個用于視覺與語言的生成式圖像到文本轉換 Transformer

摘要 在本文中&#xff0c;我們設計并訓練了一個生成式圖像到文本轉換 Transformer——GIT&#xff0c;以統一視覺-語言任務&#xff0c;如圖像/視頻字幕生成和問答。雖然生成式模型在預訓練和微調之間提供了一致的網絡架構&#xff0c;但現有工作通常包含復雜的結構&#xff…

20250706-9-Docker快速入門(下)-Docker在線答疑_筆記

一、Kubernetes核心概念與集群搭建 1. 在線答疑 &#xfeff; 1&#xff09;答疑Docker需要掌握到什么程度 學習目標&#xff1a;達到入門水平即可&#xff0c;重點掌握第一章Docker入門視頻內容學習建議&#xff1a;預習時間約3-4小時&#xff0c;建議吸收視頻內容的80%學…

Node.js-http模塊

HTTP 協議 概念 HTTP&#xff08;hypertext transport protocol&#xff09;協議&#xff1b;中文叫超文本傳輸協議,是一種基于TCP/IP的應用層通信協議這個協議詳細規定了 瀏覽器 和萬維網 服務器 之間互相通信的規則。協議中主要規定了兩個方面的內容 客戶端&#xff1a;用來…

Java JDBC的初步了解

文章目錄 基本流程注冊驅動的兩種方法DriverManagerDriverManager 的核心作用核心原理自動注冊驅動的機制關鍵方法 示例代碼: 連接Mysql數據庫StatementPreparedStatement JDBC全稱Java DataBase Connectivity。 定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…

QT 第十二講 --- 控件篇 LineEdit,TextEdit與ComboBox

前言&#xff1a;歡迎進入 QT 控件世界的第十二講&#xff01;在上一講《QT 第十一講 --- 控件篇 LCDnumber&#xff0c;ProgressBar與CalenderWidget》中&#xff0c;我們探索了用于信息展示和狀態反饋的控件&#xff1a;精準的數字顯示器 LCD Number、直觀的進度指示器 Progr…

VSCode遇到的一些小毛病(自動保存、運行后光標不再處于編輯區)

1. 右鍵點擊Run Code沒有觸發自動保存 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾選你需要的 2. 運行后光標仍然處于編輯區&#xff08;容易誤輸入&#xff09; 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.單文件和項目&#xff08;多個 py 文件項目/模塊化&#xff09;# 在編寫代碼時&#xff0c;一般兩種模式&#xff0c;執行單個文件&#xff0c;或者執行一個完成項目&#xff08;包含多個 py 文件或者其它資源文件&#xff09;。 單文件模式&#xff1a;MaixVision 創建或者…

征信系統架構思想:打造商業信任基石_東方仙盟—仙盟創夢IDE

一、建設必要性在復雜的商業環境中&#xff0c;企業面臨多元交易對象與業務場景&#xff0c;準確評估合作方信用狀況及潛在價值的難度顯著增加。傳統經驗判斷和簡單背景調查存在局限性&#xff0c;難以滿足現代商業決策需求&#xff0c;因此構建科學的征信體系具有現實必要性。…

網安-XSS-pikachu

介紹 XSS&#xff0c;即跨站腳本攻擊&#xff0c;是指攻擊者利用Web服務器中的代碼漏洞&#xff0c;在頁面中嵌入客戶端腳本&#xff08;通常是一段由JavaScript編寫的惡意代碼&#xff09;&#xff0c;當信任此Web服務器的用戶訪問 Web站點中含有惡意腳本代碼的頁面&#xff…

算法入門——字典樹(C++實現詳解)

字典樹&#xff08;Trie&#xff09;是處理字符串匹配的高效數據結構&#xff0c;廣泛應用于搜索提示、拼寫檢查等場景。本文將帶你從零掌握字典樹的原理與實現&#xff01; 一、什么是字典樹&#xff1f; 字典樹&#xff08;Trie&#xff09;是一種樹形數據結構&#xff0c;…

SpringBoot整合SpringCache緩存

SpringBoot整合SpringCache使用緩存 文章目錄SpringBoot整合SpringCache使用緩存1.介紹2.SpringBoot整合1.導入xml依賴2.配置yml3.使用EnableCaching啟用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他屬性配置1.keyGenerator 屬性2. cacheManage…

WPF學習筆記(20)Button與控件模板

Button與控件模板一、 Button默認控件模板詳解二、自定義按鈕模板一、 Button默認控件模板詳解 WPF 中的大多數控件都有默認的控件模板。 這些模板定義了控件的默認外觀和行為&#xff0c;包括控件的布局、背景、前景、邊框、內容等。 官方文檔&#xff1a;https://learn.mic…

藍天居士自傳(1)

藍天居士何許人&#xff1f; 藍天居士是我的筆名&#xff0c;也可以說是號。就好像李白號青蓮居士、歐陽修號六一居士一樣。筆者本名彭昊 —— 一個有不少重名重姓者的名字。 筆者小的時候上語文課&#xff0c;無論是小學、初中抑或是高中&#xff0c;都會有魯迅&#xff08;…

短劇系統開發定制全流程解析:從需求分析到上線的專業指南

一、短劇行業數字化趨勢與系統開發必要性在短視頻內容爆發式增長的時代背景下&#xff0c;短劇作為一種新興的內容形式正在迅速崛起。數據顯示&#xff0c;2023年中國短劇市場規模已突破300億元&#xff0c;用戶規模達到4.5億&#xff0c;年增長率超過200%。這一迅猛發展的市場…

getBoundingClientRect() 詳解:精準獲取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一個強大的 DOM API&#xff0c;用于獲取元素在視口中的精確位置和尺寸信息。它返回一個 DOMRect 對象&#xff0c;包含元素的坐標、寬度和高度等關鍵幾何信息。 基本用法 const element document.getElementById(myElement); cons…