CometPipe数据发送一点改动
来源:互联网 发布:足球看盘软件 编辑:程序博客网 时间:2024/05/23 22:25
CometPipe数据发送一点改动
Author:放翁(文初)
场景:
前提:长连接推送(每个请求会话时间保持较久)。在事件驱动模式下,多线程可能同时完成任务并通过Http长连接下发数据,对于Response需要有一定的并发保护。
第一版
增加一个lock,获得以后才可以使用Response。
每个线程的处理流程:get lock à use response àrelease lock。
在同一个通道的事件大量并发产生的时候,由于use response比较“重”,使得大量线程生命周期加大(顺序的获取锁),上下文切换频繁,系统load较高。
第二版(现在的版本)
去掉lock,为每一个请求会话增加一个队列和后台线程。
每个线程的处理流程:add message to queue。
后台线程block to wait message and deliver。
第一版的问题不存在了,但在没有消息下行的时候,大量后台线程block wait,对于内存来说还是有些浪费。
复杂却未必有好效果的版本
从上面来看,需要做的就是防止将发送数据放入竞争事务(也就是一个时期只有一个线程负责对队列数据的获取和下发),需要复用线程为多个请求处理下行任务。
大致解释一下流程:
1. 每个线程在放入队列的时候需要先获得读写锁的读锁,然后将数据放入队列。具体获得读锁的目的最后谈。
2. 线程判断是否已经有后台支持线程来处理消息下发,如果没有尝试的去操作needworkerflag的原子布尔对象。
3. 线程如果成功的将needworkerflag原子布尔对象由true改成了false状态,那么表示他获得了取得线程事件的令牌,就向线程池发起执行下发消息的任务。
4. 线程池收到任务后,分配一个线程循环的去获取数据并下发,直到队列瞬时为空。
5. 获取写锁,重新再检查队列是否有数据,如果有下行,然后修改needworkerflag为true,最后释放写锁。(用读写锁就是为了在后台线程退出时保证队列中的被加入的数据完全被执行,而没有并发导致遗留数据在队列但没有任何线程处理的情况,带来的坏处就是在这个写锁临界区里面会有写出动作会阻塞外部在那个时候放数据的过程)
设计很复杂,能够带来的比第二个设计好的点就是可能在消息并发较低的时候充分利用资源,但坏处还是很多的,包括线程切换,线程退出时的短时阻塞,线程池容量大小的考虑。
大家如果有更好的设计和实现的方式可以一起讨论并给出设计和实现的细节说明。
- CometPipe数据发送一点改动
- Ocupload的一点改动
- Socket连接发送数据的一点问题
- OGRESE 在PickObject时候的一点小改动 以及高亮的一点小改动
- 邮件发送一点心得
- 效率狗的迷茫!改动一点节约了1分钟
- [原创]我对类似QQ游戏数据采集和发送程序的一点思路
- 发送数据
- 发送数据
- 数据发送
- excel 表格截图(数据改动图…
- 改动已经存在数据的MySQL表结构
- 给Lucene加入性能更好的中文分词1 的一点改动
- 网上一个关于支持打印的ListView类代码的一点改动
- 通达OA开发 常用网址的一点小改动 你能看出来吗
- 从网上搜索的格式化crs_stat -t输出的内容,挺不错,改动了一点内容
- rsync 3.1.1版本非root运行服务时配置文件的一点改动
- 关于C#发送邮件的一点体会
- 我要学好编程
- Cannot send session cache limiter - headers already sent 的php错误怎么...
- C# 随机数 数组定义和初始化
- ASP.NET中为GridView添加删除提示框
- tar 命令 学习笔记
- CometPipe数据发送一点改动
- 应用层调用驱动程序的方法
- 《由》续——关于BrainFK的应用(上)
- 抒情篇
- 早期三大电脑CPU厂商
- 自己做项目
- C# 常用函数
- V$SQL_BIND_CAPTURE 获取绑定变量的值
- 如何将url转成GB2312制式