ASIO协程彻底转变你的思维
2016-07-27 18:04
260 查看
这个思路很简单,可是如果要求 : 必须单线程异步呢?
avbot 是一个纯粹的单线程程序,绝对不允许多线程化。所有的逻辑必须使用异步处理。
那么,这个问题就复杂化了, “avbot 收到消息后,遍历这个列队执行消息发送” 这个做法,不可避免的带来了阻塞。好吧,异步遍历吧。
要是异步遍历还没遍历完,又来一个消息呢? 考虑这个问题,你会发疯的。因为异步,太多的细节需要考虑了。真的。
好吧,又有个好主意了,为每个客户端建立一个列队,每次遍历就是把要发送的消息挂入列队即可。这样也不需要异步遍历了,同步就可以。解决了异步遍历的时候又来一个消息导致的痛苦的调度。
然后细分,考虑每个客户端,就是等待 “发送列队” 不为空!等等,一直这么等待也不行,如果客户断开了链接呢? 所以要 “同时等待发送列队不为空&&客户正常在线,并且已经发送了 HTTP 请求头部”
好绕口,不过也只能如此了。
avbot 因为默认使用了 keep-alive , 所以发送是一个死循环,知道客户端主动断开链接或者网络发生错误。如果 客户端死了,那么,发送列队兴许会出现 爆队 的情况。所以要限制发送列队的大小。不是满了就不发送,而是满了后就把早的消息踢掉,也就是让 客户端发生“暂时性卡死”后,还能继续处理最后的几条信息。
诶,复杂的逻辑终于理清了。
出处:http://bbs.chinaunix.net/thread-4076595-1-1.html
avbot 是一个纯粹的单线程程序,绝对不允许多线程化。所有的逻辑必须使用异步处理。
那么,这个问题就复杂化了, “avbot 收到消息后,遍历这个列队执行消息发送” 这个做法,不可避免的带来了阻塞。好吧,异步遍历吧。
要是异步遍历还没遍历完,又来一个消息呢? 考虑这个问题,你会发疯的。因为异步,太多的细节需要考虑了。真的。
好吧,又有个好主意了,为每个客户端建立一个列队,每次遍历就是把要发送的消息挂入列队即可。这样也不需要异步遍历了,同步就可以。解决了异步遍历的时候又来一个消息导致的痛苦的调度。
然后细分,考虑每个客户端,就是等待 “发送列队” 不为空!等等,一直这么等待也不行,如果客户断开了链接呢? 所以要 “同时等待发送列队不为空&&客户正常在线,并且已经发送了 HTTP 请求头部”
好绕口,不过也只能如此了。
avbot 因为默认使用了 keep-alive , 所以发送是一个死循环,知道客户端主动断开链接或者网络发生错误。如果 客户端死了,那么,发送列队兴许会出现 爆队 的情况。所以要限制发送列队的大小。不是满了就不发送,而是满了后就把早的消息踢掉,也就是让 客户端发生“暂时性卡死”后,还能继续处理最后的几条信息。
诶,复杂的逻辑终于理清了。
出处:http://bbs.chinaunix.net/thread-4076595-1-1.html
相关文章推荐
- boost库中文 英文参考文章
- 利用Boost库进行序列化
- Boost库
- win8.1+vs2013下安装CGAL(含qt、boost、cmake)
- 编译boost库 I
- qt+boost--asio+tcp文件传输
- 编译boost II
- boost asio
- boost::asio::serial_port set RTS DTS
- boost中的socket的async_read_some() 方法会导致严重的阻塞
- boost::thread新建线程如何不阻塞
- async_read_some
- asio::deadline_timer
- boost 多线程 超时
- boost::asio::async_write() versus boost::asio::write()
- boost信号
- boost的signal和solt机制使用入门
- 消息队列
- boost线程同步
- boost::bind III