领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型都是常用的客户-服务器编程模型。这几天翻了些文章,发现对领导者/追随者模型说的比较少,下面就这个模型打个比方:
- 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业。
- 一般就是有一个山贼在山路口察看,其他人在林子里面睡觉。
- 假如发现有落单的过往客商,望风的山贼就会弄醒一个睡觉的山贼,然后自己去打劫。
- 醒来的山贼接替作望风的事情。
- 打劫的山贼搞定以后,就会去睡觉,直到被其他望风的山贼叫醒来望风为止。
- 有时候过往客商太多,而山贼数量不够,有些客商就能侥幸平安通过山岭(所有山贼都去打劫其他客商了)。
下面是这个模式的计算机版本:
- 有若干个线程(一般组成线程池)用来处理大量的事件
- 有一个线程作为领导者,等待事件的发生;其他的线程作为追随者,仅仅是睡眠。
- 假如有事件需要处理,领导者会从追随者中指定一个新的领导者,自己去处理事件。
- 唤醒的追随者作为新的领导者等待事件的发生。
- 处理事件的线程处理完毕以后,就会成为追随者的一员,直到被唤醒成为领导者。
- 假如需要处理的事件太多,而线程数量不够(能够动态创建线程处理另当别论),则有的事件可能会得不到处理。
这个模型其实并不难于理解,但是我想假如是中国人给起的名字的话,也许会叫作 "皇帝轮流做,今年到我家" 模型更加贴切,因为领导者追随者之间是一种平等的关系。这不符合大部分人对于"领导者-追随者"的通常意义的理解。说句实话,个人认为半同步/半异步模型 叫做"领导者-追随者'更加适合,不相信可以看看例子:
- 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业。
- 他们有一个山贼头头,他专门负责望风,其他的喽罗待命。
- 假如发现有落单的过往客商,山贼头头会到路口拦路,让客商双手抱头蹲在地上,然后让一个小喽罗为这个倒霉鬼"服务"。
- 假如客商很多,山贼头头会让客商在地上蹲成一排(严肃点,排队啦,打劫啦)。 一群小喽罗挨个为大家"服务"。
- 头头的工作很重要,对于每个客商他都不会花费太多时间,拦路以后,他会让客商排队等待打劫。
- 过往客商太多而山贼数量不够,客商的排队可能需要等待较长的时间。
这个就是半同步/半异步模型的比喻,可以参考一下 http://www.javaeye.com/article/60414
大家可以看到这两个模式之间的区别,最显著的,就是半同步/半异步模型拥有一个显式的待处理事件队列,而领导者-追随者模型没有一个显式的队列(很 多IO机制操作系统一般会有一个隐式的队列)。因为这个事件队列,半同步/半异步模型可以获得处理上的灵活性,但是因为上下文的切换,效率上却比领导者- 追随者模型稍有不及。