分別以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循環,但區別在於,調度的邏輯是否包含在內。事件循環模式把調度的邏輯放由協程來組織實現,而控制器模式是放到自己內部來實現。