日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言channel超時機(jī)制

Go語言沒有提供直接的超時處理機(jī)制,所謂超時可以理解為當(dāng)我們上網(wǎng)瀏覽一些網(wǎng)站時,如果一段時間之后不作操作,就需要重新登錄。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、成都做網(wǎng)站、嘉定網(wǎng)絡(luò)推廣、小程序開發(fā)、嘉定網(wǎng)絡(luò)營銷、嘉定企業(yè)策劃、嘉定品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供嘉定建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

那么我們應(yīng)該如何實現(xiàn)這一功能呢,這時就可以使用 select 來設(shè)置超時。

雖然 select 機(jī)制不是專門為超時而設(shè)計的,卻能很方便的解決超時問題,因為 select 的特點(diǎn)是只要其中有一個 case 已經(jīng)完成,程序就會繼續(xù)往下執(zhí)行,而不會考慮其他 case 的情況。

超時機(jī)制本身雖然也會帶來一些問題,比如在運(yùn)行比較快的機(jī)器或者高速的網(wǎng)絡(luò)上運(yùn)行正常的程序,到了慢速的機(jī)器或者網(wǎng)絡(luò)上運(yùn)行就會出問題,從而出現(xiàn)結(jié)果不一致的現(xiàn)象,但從根本上來說,解決死鎖問題的價值要遠(yuǎn)大于所帶來的問題。

select 的用法與 switch 語言非常類似,由 select 開始一個新的選擇塊,每個選擇條件由 case 語句來描述。

與 switch 語句相比,select 有比較多的限制,其中最大的一條限制就是每個 case 語句里必須是一個 IO 操作,大致的結(jié)構(gòu)如下:

select {
    case <-chan1:
    // 如果chan1成功讀到數(shù)據(jù),則進(jìn)行該case處理語句
    case chan2 <- 1:
    // 如果成功向chan2寫入數(shù)據(jù),則進(jìn)行該case處理語句
    default:
    // 如果上面都沒有成功,則進(jìn)入default處理流程
}

在一個 select 語句中,Go語言會按順序從頭至尾評估每一個發(fā)送和接收的語句。

如果其中的任意一語句可以繼續(xù)執(zhí)行(即沒有被阻塞),那么就從那些可以執(zhí)行的語句中任意選擇一條來使用。

如果沒有任意一條語句可以執(zhí)行(即所有的通道都被阻塞),那么有如下兩種可能的情況:

  • 如果給出了 default 語句,那么就會執(zhí)行 default 語句,同時程序的執(zhí)行會從 select 語句后的語句中恢復(fù);
  • 如果沒有 default 語句,那么 select 語句將被阻塞,直到至少有一個通信可以進(jìn)行下去。

示例代碼如下所示:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    quit := make(chan bool)

    //新開一個協(xié)程
    go func() {
        for {
            select {
            case num := <-ch:
                fmt.Println("num = ", num)
            case <-time.After(3 * time.Second):
                fmt.Println("超時")
                quit <- true
            }
        }

    }() //別忘了()

    for i := 0; i < 5; i++ {
        ch <- i
        time.Sleep(time.Second)
    }

    <-quit
    fmt.Println("程序結(jié)束")
}

運(yùn)行結(jié)果如下:

num =  0
num =  1
num =  2
num =  3
num =  4
超時
程序結(jié)束


文章標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語言channel超時機(jī)制
文章URL:http://www.5511xx.com/article/djssgdd.html