Go語言併發之道學習九 心跳

2021-09-26 13:10:35 字數 2789 閱讀 5827

package main

import (

"math/rand"

"time"

"fmt")/*

併發程序取消的原因:

·超時:超時是隱式取消

·使用者干預:為了獲取良好的使用者體驗,通常建議維持乙個長連線,然後以輪詢間隔將狀態報告傳送給使用者,或允許使用者檢視他們認為合適的狀態。

當使用者使用併發程式時,有時需要允許使用者取消他們已經開始的操作。

·父程序取消:對於這個問題,如果任何一種併發操作的父程序停止,那麼子程序也將被取消。

·複製請求:我們可能希望將資料傳送到多個併發程序,以嘗試從其中乙個程序獲得更快的響應。

當第乙個響應回來的時候,我們將會取消其餘的程序。

*/func main()

//心跳

func testheart(),

pulseinterval time.duration,

) (<-chan inte***ce{},<-chan time.time) )

results := make(chan time.time)

go func() {}:

default:}}

sendresult := func(r time.time) }}

for

}}()

return heartbeat,results

} /*

·heartbeat := make(chan inte***ce{})

我們建立了乙個傳送心跳的channel ,我們把這個返回給 dowork。

·pulse := time.tick(pulseinterval)

我們設定心跳的間隔時間為我們接到的pulseinterval ,每隔乙個pulseinterval 的時長都會有一些東西讀取這個channel

·workgen := time.tick(2*pulseinterval)

這是另乙個用來模擬滴答聲的channel ,我們選擇的持續時間大於pulseinterval ,這樣我們就能看到從goroutine中發出的一些心跳。

·case heartbeat <- struct {}{}:

default:

注意,我們在這裡加入了乙個預設語句,我們必須時刻警惕這樣乙個事實:

可能會沒有人接收我們的心跳,從goroutine 發出的資訊是重要的,但心跳卻不一定重要。

·case <-pulse:

sendpulse()

就像done channel 一樣,當你執行傳送或接收時,你也需要包含乙個傳送心跳的分支。

*/ done := make(chan inte***ce{})

time.afterfunc(10*time.second, func() )

const timeout = 2*time.second

heartbeat,results := dowork(done,timeout/2)

for

fmt.println("pulse")

case r,ok := <-results:

if ok == false

fmt.printf("results %v\n", r.second())

case <-time.after(timeout):

return

} }/* ·time.afterfunc(10*time.second, func() )

我們宣告了乙個標準的done channel ,並在10秒後關閉,這給我們的goroutine 做一些工作的時間

·const timeout = 2*time.second

這裡我們設定了超時時間,我們使用此方法將心跳間隔與超時時間聯絡起來

·heartbeat,results := dowork(done,timeout/2)

我們在這裡timeout/2 ,這使得我們的心跳有額外的響應時間,以便我們的超時有一定緩衝時間。

·case _,ok := <-heartbeat:

在這裡,我們處理心跳,當沒有訊息時,我們至少知道每過timeout/2 的時間會從心跳channel 發出一條訊息。

如果我們什麼都沒有收到,我們便知道是goroutine 本身出了問題。

·case r,ok := <-results:

在這裡,我們處理results channel

·case <-time.after(timeout):

如果我們沒有收到心跳或其他訊息,就會超時

*/}func testheart2(),

) (<-chan inte***ce{},<-chan int),1)

workstream := make(chan int)

go func() {}:

default:

}select

}}()

return heartbeatstream,workstream

} done:=make(chan inte***ce{})

defer close(done)

heartbeat,results := dowork(done)

for else

case r,ok := <-results:

if ok else

} }/* ·heartbeatstream := make(chan inte***ce{},1)

在這裡,我們建立乙個緩衝區大小為1的 heartbeat channel ,這確保了即使沒有及時接受傳送的訊息,至少也會傳送乙個心跳。

·for i:=0;i < 10;i++

Go語言學習九 Go語言指標

go 語言中指標是很容易學習的,go 語言中使用指標可以更簡單的執行一些任務。接下來讓我們來一步步學習 go 語言指標。我們都知道,變數是一種使用方便的佔位符,用於引用計算機記憶體位址。go 語言的取位址符是 放到乙個變數前使用就會返回相應變數的記憶體位址。package main import f...

GO語言學習 併發

goroutine 由go執行環境管理的輕量級執行緒 channel 有型別的管道,操作符為 資料流向箭頭指向的方向 使用make chan 緩衝資料型別 緩衝區長度 來建立 使用close chan 來關閉管道,只有傳送者才允許關閉管道 例ch make chan int 10 ch 10 a c...

GO語言學習 併發

通道channel 併發 concurrency 邏輯上具備同時處理多個任務的能力。並行 parallesim 不同於併發,物理上的同一時刻,相當於併發設計的理想執行模式。在函式呼叫前新增go關鍵字即可建立併發任務 a 100go func x,y int a,counter a a 66print...