分别以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循环,但区别在于,调度的逻辑是否包含在内。事件循环模式把调度的逻辑放由协程来组织实现,而控制器模式是放到自己内部来实现。