基于事件循环和基于控制的调度模式区别

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

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