windows下darwin接收到socket消息如何处理?
所有的socket消息入口只有一个线程,而且是单线程:void EventThread::Entry().
这个线程不断地遍历所有注册到窗口的socket消息(每一个新的socket,注册到窗口的消息id不同).
此处的单线程循环处理所有客户端的消息,是否能达到高性能,个人感觉不能(上百万客户端,仅仅靠单线程捕获消息) 。
当消息到达后,在EventThread中仅仅是调用了一个耗时极短的函数:ProcessEvent。

在EventContext中,该函数将任务放到taskthread队列中(让线程池去处理消息),后直接返回。


事实上,通过调试发现,EventThread线程获监听的消息绝大多数为:FD_READ | FD_ACCEPT | FD_CLOSE,对于
其他消息如:FD_WRITE的消息是很少去注册,直接发送数据到客户端即可。想想也是,rtsp流媒体服务器,不会主动发消息给客户端,都是
接收到FD_READ消息后,去响应该消息而将数据发送给客户端。FD_WRITE消息很少注册将大大降低EventThread线程的工作压力,
当多个客户端同时从服务器上接收rtsp流时,EventThread线程压力很低,因此此过程中读消息(FD_READ | FD_ACCEPT | FD_CLOSE)
很少发生。 

但是当有多个rtsp推流器,将数据流推送到darwin服务器上时,服务器将频繁的收到FD_READ消息,因此压力会很大。服务器同时支持多少个推送客户端推送rtsp数据流,需要进一步测试。


darwin之socket消息处理性能问题研究

darwin之socket消息处理性能问题研究


模拟一个rtsp推流器,推送视频流到darwin服务器上,相当于一个客户端一直往服务器上发送窗口消息(消息id相同),如下所示,服务器会一直收到窗口消息id为1036的socket数据流。


darwin之socket消息处理性能问题研究


darwin之socket消息处理性能问题研究




相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-17
  • 2021-08-21
猜你喜欢
  • 2021-07-17
  • 2022-12-23
  • 2021-07-13
  • 2021-12-31
  • 2022-12-23
相关资源
相似解决方案