最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go使用chan或context退出協(xié)程示例詳解

 更新時(shí)間:2023年08月15日 17:27:38   作者::Darwin  
這篇文章主要為大家介紹了Go使用chan或context退出協(xié)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

問(wèn)題

go兩個(gè)協(xié)程使用了同一個(gè)文件句柄,其中一個(gè)協(xié)程關(guān)閉了這個(gè)文件句柄并退出了協(xié)程,如何及時(shí)通知另一個(gè)協(xié)程退出?

分析

當(dāng)一個(gè)協(xié)程關(guān)閉了這個(gè)文件對(duì)象后,底層文件的文件描述符就會(huì)被釋放。

這個(gè)時(shí)候,另一個(gè)協(xié)程還持有著同一個(gè)文件對(duì)象,但其實(shí)對(duì)應(yīng)的文件描述符已經(jīng)不存在了。

所以當(dāng)?shù)诙€(gè)協(xié)程通過(guò)這個(gè)文件對(duì)象再對(duì)文件進(jìn)行操作的時(shí)候,例如讀寫(xiě)文件等,就會(huì)發(fā)生異常,比如文件描述符不存在錯(cuò)誤等。

解決

為了避免這個(gè)問(wèn)題,共享文件對(duì)象的多個(gè)協(xié)程需要通過(guò)一個(gè)通道或鎖進(jìn)行協(xié)調(diào):

每個(gè)協(xié)程在使用文件對(duì)象前需要獲得鎖或從通道接收通知。

最后關(guān)閉文件對(duì)象的協(xié)程在關(guān)閉后,通過(guò)通道或解鎖來(lái)通知其他協(xié)程對(duì)象已經(jīng)無(wú)效。

其他協(xié)程收到通知后,就不再對(duì)這個(gè)已關(guān)閉的文件對(duì)象進(jìn)行操作。

1. 使用 channel 通道

在主協(xié)程中,可以定義一個(gè) channel,用來(lái)通知其它協(xié)程退出。協(xié)程在執(zhí)行時(shí)可以監(jiān)聽(tīng)這個(gè) channel,一旦接收到退出通知,就可以進(jìn)行清理工作,并退出協(xié)程。

quit := make(chan bool)
go func() {
    defer fmt.Println("Goroutine exit")
    for {
        select {
        case <-quit:
            return
        default:
            // ...
        }
    }
}()
// 主協(xié)程中發(fā)送退出通知
quit <- true

2. 使用 context 包

Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)中提供了 context 包,可以用來(lái)控制協(xié)程的生命周期。

在主協(xié)程中可以創(chuàng)建一個(gè) context 對(duì)象,并將其傳遞給協(xié)程,然后調(diào)用 cancel 方法,通知所有協(xié)程退出。

context.Background() 是 Go 上下文系統(tǒng)中一個(gè)重要的初始預(yù)定義上下文值,代表了一個(gè)沒(méi)有截止時(shí)間限制的空上下文環(huán)境。

1.使用WithCancel函數(shù)創(chuàng)建上下文和取消函數(shù)

ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("exit")
            return
        default:
            // 執(zhí)行一些耗時(shí)的操作
            time.Sleep(1 * time.Second)
            fmt.Println("running")
        }
    }
}(ctx)
time.Sleep(5 * time.Second)
// cancel()
fmt.Println("cancelled")
time.Sleep(1 * time.Second)

2.使用Deadline超時(shí)結(jié)束協(xié)程

ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second))

3.使用WithTimeout限定操作時(shí)間

ctx, cancel := context.WithTimeout(context.Background(), time.Second)

以上就是Go使用chan或context退出協(xié)程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go chan context退出協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang中json的omitempty使用操作

    golang中json的omitempty使用操作

    這篇文章主要介紹了golang中json的omitempty使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go map發(fā)生內(nèi)存泄漏解決方法

    Go map發(fā)生內(nèi)存泄漏解決方法

    這篇文章主要介紹了Go map發(fā)生內(nèi)存泄漏解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    這篇文章主要介紹了Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Go?Redis客戶端使用的兩種對(duì)比

    Go?Redis客戶端使用的兩種對(duì)比

    這篇文章主要為大家介紹了Go?Redis客戶端使用對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 深入理解Go語(yǔ)言中接口的使用

    深入理解Go語(yǔ)言中接口的使用

    在現(xiàn)代編程語(yǔ)言中,接口是不可或缺的一個(gè)重要特性,這篇文章將為大家詳細(xì)介紹Go語(yǔ)言中的接口,從而能夠更好得使用Go語(yǔ)言,需要的可以參考一下
    2023-06-06
  • Golang極簡(jiǎn)入門(mén)教程(二):方法和接口

    Golang極簡(jiǎn)入門(mén)教程(二):方法和接口

    這篇文章主要介紹了Golang極簡(jiǎn)入門(mén)教程(二):方法和接口,本文同時(shí)講解了錯(cuò)誤、匿名域等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Gin框架令牌桶限流實(shí)戰(zhàn)指南

    Gin框架令牌桶限流實(shí)戰(zhàn)指南

    限流是一種通過(guò)控制請(qǐng)求處理速率來(lái)保護(hù)系統(tǒng)的技術(shù),它能有效防止服務(wù)器因突發(fā)流量或惡意攻擊而過(guò)載,確保服務(wù)的穩(wěn)定性和可用性,本文就來(lái)介紹一下Gin 框架令牌桶限流的實(shí)現(xiàn),感興趣的可以了解一下
    2025-10-10
  • Go泛型的理解和使用小結(jié)

    Go泛型的理解和使用小結(jié)

    泛型是一種非常強(qiáng)大的編程技術(shù),可以提高代碼的復(fù)用性和可讀性,通過(guò)泛型容器和類(lèi)型參數(shù)化,Go語(yǔ)言中的泛型可以實(shí)現(xiàn)更加靈活和通用的編程,提高代碼的復(fù)用性和可維護(hù)性,本文給大家介紹Go泛型的理解和使用,感興趣的朋友一起看看吧
    2023-12-12
  • Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    反射指的是運(yùn)行時(shí)動(dòng)態(tài)的獲取變量的相關(guān)信息。本文將為大家詳細(xì)介紹Go語(yǔ)言中反射的用法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-04-04
  • 深入解析快速排序算法的原理及其Go語(yǔ)言版實(shí)現(xiàn)

    深入解析快速排序算法的原理及其Go語(yǔ)言版實(shí)現(xiàn)

    這篇文章主要介紹了快速排序算法的原理及其Go語(yǔ)言版實(shí)現(xiàn),文中對(duì)于快速算法的過(guò)程和效率有較為詳細(xì)的說(shuō)明,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

金阳县| 黎平县| 越西县| 越西县| 赤水市| 建始县| 玉环县| 兴和县| 文山县| 五台县| 昌邑市| 上杭县| 囊谦县| 团风县| 渝中区| 基隆市| 辛集市| 行唐县| 古浪县| 孟连| 上虞市| 娄底市| 米林县| 台中市| 邮箱| 大港区| 抚松县| 红桥区| 尼玛县| 姚安县| 兴国县| 晋城| 罗甸县| 靖宇县| 新源县| 安仁县| 泊头市| 临泉县| 旬邑县| 保定市| 大洼县|