基於事件循環和基於控制的調度模式區別

分別以tornado 和 k8s中用到的事件循環和 控制器模式 來說

事件循環

,中需要一個以selecor或epoll爲基礎的事件循環,可以理解爲一個while True,協程把自己註冊到該循環中,這樣就能通過事件循環的方式被執行,但是調度的執行邏輯需要協程來組織實現。假如一個整體邏輯,是由A-B-C三部分組成,如果是一般的寫法就是把三個部分都放到一個函數中去寫,如果是事件循環加協程方式的話,就需要把ABC分別拿出來,分別寫成三個不同的協程函數。例如下面,然後通過註冊到主事件循環中實現調度

async def a():
    yield 1
    yield 2
    yield 3

async def b():
    await a

async def c():
    await b

Kubernetest中是通過控制器模式來實現的調度

簡單來說,就是各個被調度的api對象把自己註冊到控制器中,控制器也是一個while True的循環,但是,調度邏輯也是寫到控制器中的,例如下面的僞代碼

for {
  desired := getDesiredState()
  current := getCurrentState()
  makeChanges(desired, current)
}

總結: 事件循環模式和控制器模式本質上都是一個while循環,但區別在於,調度的邏輯是否包含在內。事件循環模式把調度的邏輯放由協程來組織實現,而控制器模式是放到自己內部來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章