`
youxinrencwx
  • 浏览: 71136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CometPipe数据发送一点改动

 
阅读更多

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. 获取写锁,重新再检查队列是否有数据,如果有下行,然后修改needworkerflagtrue,最后释放写锁。(用读写锁就是为了在后台线程退出时保证队列中的被加入的数据完全被执行,而没有并发导致遗留数据在队列但没有任何线程处理的情况,带来的坏处就是在这个写锁临界区里面会有写出动作会阻塞外部在那个时候放数据的过程)

设计很复杂,能够带来的比第二个设计好的点就是可能在消息并发较低的时候充分利用资源,但坏处还是很多的,包括线程切换,线程退出时的短时阻塞,线程池容量大小的考虑。

大家如果有更好的设计和实现的方式可以一起讨论并给出设计和实现的细节说明。

分享到:
评论

相关推荐

    9-2 串口发送+接收改动-蓝牙

    在本文中,我们将深入探讨如何在STM32微控制器上实现串口发送和接收功能,特别是在与蓝牙设备交互时的改动。STM32是意法半导体(STMicroelectronics)推出的一系列高性能、低功耗的微控制器,广泛应用于各种嵌入式...

    ES数据导出工具-改动说明1

    **ES数据导出工具改动说明** 在IT行业中,Elasticsearch(简称ES)是一个非常流行的分布式搜索引擎和数据分析平台,广泛应用于日志分析、实时搜索、数据可视化等多个领域。随着数据量的增长,有时我们需要将ES中的...

    跨进程发送消息数据

    “跨进程”和“消息”、“发送数据”直接对应了主题,说明讨论的是 Delphi 中如何实现跨进程间的消息传递。 根据压缩包内的文件名,我们可以推测其中包含的资源可能是一个完整的示例程序。"delTemp第二代-朱建强版....

    ES数据导出工具-改动说明2

    **ES数据导出工具改动说明2** 在当前的版本V1.2中,ES(Elasticsearch)数据导出工具进行了重大改进,旨在提高效率、安全性以及用户友好性。以下是这次更新的三个核心变动点: 1. **多线程支持** 在过去的版本中...

    大文件JSON数据格式化工具与修改前后对比方法 迅速找出不同改动点

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传输数据。它基于JavaScript的一个子集,格式清晰,易于人类阅读,同时也易于机器解析和生成。在处理大型JSON文件时,...

    IdTCPServer和IdTCPClient的使用(支持文件发送)

    一旦有客户端连接,`IdTCPServer` 可以接收客户端发送的数据并做出响应。而 `IdTCPClient` 是客户端组件,它负责建立与服务器的连接,并发送或接收数据。在文件传输场景中,`IdTCPClient` 可以将本地文件内容发送到 ...

    !!(随书源码)IBM SPSS数据分析与挖掘实战案例精萃.iso

    否则读者就需要手工对每个数据流中相应节点的读取和写入数据文件目录位置进行改动,这样才能使数据流正常运行。读者如果希望同时获取IBM SPSS Statistics 20.0和IBM SPSS Modeler 14.1全功能试用版,以及相应软件的...

    USB声卡程序,基于WM8978(16位改动)

    在USB声卡项目中,STM32作为主控器,负责USB接口的管理,接收来自PC的数据,经过适当的处理后,通过I2S接口发送给WM8978,同时接收WM8978编码后的音频数据并将其通过USB发送回PC。 在实际开发过程中,"16位改动...

    2023王道书改动清单.pdf

    * 补充流水线的数据通路、数据和控制信号的流动、流水线的执行过程(4页)。 * 优化流水线的性能指标和高级流水线技术。 * 新增多处理器的基本概念(5页),及相关习题。 * 补充组合逻辑电路和时序逻辑电路的区别。 ...

    收发彩信,自动打开数据连接

    在原始的Android系统中,`TransactionService`可能只是简单地启动数据连接来发送或接收彩信,而没有处理关闭数据连接的情况。在修改后的版本中,可能添加了以下功能: 1. 监听彩信事件:当有新的彩信待发送或接收时...

    绝对可以使用的奇声DVD-8321原厂数据,未经改动。

    原厂数据,新机在线备份的。遥控丢失的奇声DVD-8321图像变成彩条,声音正常,用该固件回刷即可解决,没有刷机工具时可以使用卡刷,具体方法是将文件名改成DVDROM.BIN,存在FAT格式U盘的根目录,DVD开机不装碟,插入...

    天心数据字典,让你全面了解天心数据结构,让你真正分解天心系统,从而为你带来真正意义上的实惠和帮助。

    例如,可以找出数据表之间的关联关系,分析数据依赖性,以便在修改某个部分时能考虑到整个系统的连锁反应,防止因改动导致的问题。 四、带来实惠和帮助 掌握天心数据字典,意味着用户能够更高效地进行数据查询、...

    天宝DiNi03水准仪数据处理软件.rar

    2.程序能自动剔除超限数据及不合格数据 (请在下载完数据后不要做任何改动,不能删除字符)。3.数据有漏测的可能计算不正确,限一个测站为“后-前-前-后”,若只测了“后-前”或“后-前-后”等。类似这种情况请在...

    单向数据通信系统

    单向数据通信系统是一种通信架构,只允许数据从一个方向传输到另一个方向,不支持反向的数据流。这种系统在很多应用中都有所使用,比如广播、电视信号传输或者简单的单线传感器数据传递等。本任务是设计一个单向数据...

    易语言实现设备管理器中的扫描检测硬件改动功能

    实现设备管理器中的扫描检测硬件改动功能 .版本 2 .支持库 spec .局部变量 ok, 整数型 CM_Locate_DevNodeA (取变量地址 (ok), 0, 0)

    AUXCOM数据转发服务开发指南

    3. 站点名称是一个以'0'结尾的字符串,用于识别发送数据的远程设备,而实际的数据则位于数据域中。 在编程实现接收和发送数据时,开发者需要关注以下几点: 1. 创建socket:在DataClient程序中,创建socket的过程...

    PHPMailer邮件发送源码修正版+邮件发送实例+教程

    大概记得以前初次使用PHPMailer的时候,出现过...同时,也帮助那些为PHPMailer无法发送邮件的朋友,里面有示例,稍微改动就可成功发送邮件。 更详细教程请访问:http://blog.csdn.net/zm2714/article/details/7992910

    易语言监视文件夹是否被改动

    本篇将详细探讨如何使用易语言来实现“监视文件夹是否被改动”的功能。 首先,我们需要了解文件系统监控的基本原理。在计算机中,操作系统提供了文件系统事件通知机制,允许应用程序注册监听特定文件或文件夹的变化...

Global site tag (gtag.js) - Google Analytics