这两种都是高效的并发模式。
半同步半异步模式:
出现原因:
异步线程执行效率高,但是编写复杂,同步线程效率低,但是逻辑简单。服务器要求好的实时性和同时处理多用户的请求,英雌采用两者结合的形式。
具体情况:
过程:
异步线程见听到客户请求后,将其封装成请求对象插入请求队列,请求队列将通过通知某个工作在同步模式下的工作线程来读取并处理该请求对象。具体选择哪一个工作线程来服务这个客户请求,取决于请求队列的设计。
变体:半同步半反应堆模式
图:
解释:异步线程只有一个,由主线程充当,负责监听所有socket事件。如果监听socket上有可读事件发生,指的是新的链接请求到来,那么异步线程接受它,往epoll内核事件表中注册该socket上的读写事件。如果连接socket上有读写事件发生,要么是新的客户请求,要么时有数据要发送给客户端,主线程就把改连接socket插入请求队列。所有的工作线程睡眠在请求队列上,有任务来的时候,空闲线程竞争,获取任务接管权。
也就是说,该模式的主线程只管理监听socket,连接socket由工作线程管理。当有新的连接请求到来的时候,主线程就接受并将新返回的连接socket,以竞争的形式,给某个空闲的工作线程,此后,该线程管理这个socket所有的I/O任务,直到客户关闭连接。工作线程们各自监听管理不同的时间,不存在通信一说,因此每个线程都是异步模式。
缺点:
1 主线程和工作线程共享一个请求队列,因此一但队列中的任务有变更,就需要加锁保护。
2 每一个工作线程在同一时间只能处理一个客户请求,对于客户数良多,但是工作任务少的情况下,队友很多任务堆积,客户的响应速度越来越慢。
再改进改进
改进方面:让一个工作线程能够处理很多的客户请求。即对每一个工作线程,对于各自连接的socket们调用epoll_wait。
领导者/追随者模式
描述:多线程轮流获得事件源集合,轮流监听,分发并处理事件。这个模式下,有一个领导者线程,他负责监听I/O事件,其他线程是追随者,它们休眠在线程池等待成为新的领导者。当前的刘那个到这如果检测到I/O事件,首先要从线程池中推选新的领导者线程,然后自己处理I/O事件,或者也可以指定其他追随者处理I/O事件,本身的领导者地位就不变化了。
在该模式下的事件处理器实际上是很模糊的,由它可以派生出具体的事件处理器,它们实现基类的handle_event方法,来处理不同的任务。
工作流程图: