docker事件events監控實現分析

2021-08-15 19:54:35 字數 2244 閱讀 8896

使用乙個佇列儲存events事件,先進入到佇列的事件先得到處理

開啟乙個協程,迴圈檢測佇列中是否有事件

佇列事件的寫入必須在另外的協程中,所以必須使用鎖保護佇列events資料

設計 sink 裝載events,為保證設計的相容性,sink設計為inte***ce,sink可理解為:運輸船,將event事件運輸到相應的協程

sink 配合channel可以實現多協程間事件通知

golang channel 為一對一方式通知,設計broadcast廣播通知所有相關sinks

核心**檔案:

go-events/event.go

go-events/queue.go

// event marks items that can be sent as events.

type

event inte***ce{} //事件:宣告為inte***ce{}可相容所有資料型別

// 槽的相容性考慮

type

sink inte***ce

event 為事件原型, 實現了sink的方法都可以作為sink

queue型別宣告

type

queue struct

新建事件監控時,會啟動乙個協程迴圈檢測list(實現為佇列)中的事件

func (eq *queue) run() 

if err := eq.dst.write(event); err != nil ).witherror(err).debug("eventqueue: dropped event")}}

}

quene 的write方法,由其他協程呼叫,向list中寫入event資料;

最後達到的效果:有乙個協程從始至終檢測events事件,當另外的協程呼叫queue的write方法寫入事件時,檢測到有event事件來,使用sink(具體上次實現)write方法處理事件;

docker 實現了watch機制,等待事件獲取資料

//監控queue事件佇列上的eventupdatatask事件

watch(queue, eventupdatetask{})

watch函式原始碼(state/watch.go)

func watch(queue *watch.queue, specifiers ...event) (eventq chan events.event, cancel func()) 

return queue.callbackwatch(events.matcherfunc(func(event events.event) bool

}return

false

}))}

向callbackwatch傳入了乙個匿名事件匹配函式

callbackwatch函式(state/watch/watch.go)

func (q *queue) callbackwatch(matcher events.matcher) (eventq chan events.event, cancel func()) 

q.broadcast

.add(sink) //將sink新增到 broadcast

return ch.c, func()

}

events.newchannelevents.newfilterevents.broadcast都是sink的實現特殊功能的封裝類,具體實現參考原始碼:go-events目錄下 filter.go broadcast.go channel.go

events.broadcast特殊說明下:golang 的channel相當於乙個管道,只能實現協程間一對一的通訊;為了實現一對多的情況,go-events實現了broadcast機制:list中有事件後,通知broadcast,再由broadcast遍歷其中所有的sink,呼叫sink的write處理方法,通知相應的協程(一般情況是channel訊號,協程根據channel執行相應events動作)

通知watch向註冊監控事件,並獲取返回的channel,並在當前協程阻塞、監控channel,當事件發生時,當前協程可通過channel獲取事件型別作出相應的動作。

事件(events)尋根(一)

昨天說到現在正在研讀jeffery richter 後面簡稱jr 大師的 clr via c 聆聽著大師透徹的說理,是一種享受。於是按部就班地順次閱讀,一直到第10章,終於遇到了真正的難點,這個難點就是事件 events 確切地說是對事件實現的理解。一 這個難點難在哪?難在這裡匯聚了太多的概念和太多...

cordova學習四 事件Events

deviceready 當cordova完全載入,可以呼叫cordova api介面 支援平台 amazon fire os android blackberry 10 ios tizen windows phone 8 windows 8 pause 支援平台 amazon fire os and...

Events 事件 紅綠燈

event 用於執行緒之間狀態的同步。對全域性變數不斷地做修改。event threading.event 生成1個event的物件 event.wait 等著設定全域性變數。檢測標誌位是否有設定,如果標誌位沒有設定的話,會一直卡在這裡。等待標誌位被設定。如果標誌位被設定了,代表綠燈,直接通行。wa...