找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: yaoxing25

关于ACE_Reactor的问题(救命。。。)

[复制链接]
发表于 2009-6-15 14:24:52 | 显示全部楼层
楼主在windows下开发的吧,win下ACE_Reactor 默认为wfmo,unix下默认为select

“当一个连接正在发送数据,此时正好断连操作,将Client的指针删除,所以我现在将连接进行加锁,就不会出现这种情况了”
你用多线程跑reactor?
 楼主| 发表于 2009-6-15 23:51:43 | 显示全部楼层
谢谢,你说的情况我也考虑过,可是如果将连接加锁的话,连接会很慢,我现在有个想法是对每个连接的Client指针进行加锁,这样的话如果在连接进行时就不能删除这个指针。我是通过一个线程进行连接,同时又启动一个线程来运行run_event_loop(),这样的就不用检测run_event_loop()异常了。
还有就是我们所做的都是为了不在连接时删除指针,可是这样就能避免接收数据超时的情况吗?我一直以为是我使用ACE_Reactor的问题呢!
发表于 2009-6-17 13:22:47 | 显示全部楼层
楼主可以考虑用proactor
在并发量比较高的情况下,proactor效率更高。windows下reactor默认wfmo,只支持62个fd。想再多的话就要用多线程。而wfmo的多线程需要应用程序自己进行同步。
但是win下的proactor,即使多线程也不需要自己做同步。
所以在高并发(楼主要求800)的情况下,ACE_WIN32_Proactor不仅提供较高的性能,而且开发成本也较低。
发表于 2009-6-17 14:49:51 | 显示全部楼层
昨天还看到有帖子问类似的问题,winston刚回答了一遍、、、

首先可以在站内搜索一下关键字“引用计数”,
然后去看C++NPV2卷二6.3节,不看书的话,不是一句两句就能解释清楚滴。
 楼主| 发表于 2009-6-27 00:38:59 | 显示全部楼层
现在又出现新的问题了,就是我的handle_input()方法可以接收数据,可是我后面的方法无法及时处理这些数据,我尝试使用一个缓冲区来保存这些数据然后再启动一个线程来处理。可是同样存在一个问题,就是我的线程也无法及时处理缓冲区的数据,这样就会导致我后面的操作超时,因为我的设备的数据上报的太猛了,请问各位大侠有什么办法解决这个问题?
 楼主| 发表于 2009-6-27 00:41:46 | 显示全部楼层
上述的问题急用,希望大家尽快指点一下。。
发表于 2009-6-27 13:20:05 | 显示全部楼层
这里涉及到几个问题。
1、尝试用足够大的消息队列缓冲消息,避免阻塞。
2、加快消息的处理速度。

如果合理的架构也无法达到处理要求,那么说明你设备上面的信息太多,超过了处理设备的处理能力,用更好的设备,或者进行信息的分割,分布到不同的计算机进行处理。
发表于 2009-6-27 17:13:28 | 显示全部楼层
进行流量控制,比如:
当接收端处理跟不上时,通知发送端,并暂停部分连接服务等等。
 楼主| 发表于 2009-6-28 03:18:31 | 显示全部楼层
今天我试了一下,我执行一个我系统中的同步命令,这时候同时还有其他数据上报,并且缓冲区在加入数据和取出数据还加了同步锁,这时最大的数据量有一万多条,三十秒是我的超时时间,可是在超时之前我的系统无法将这些时间处理完,此时我的设备连接数大约有二百二十个。其他的设备只是固定时间上报二秒一条数据,执行命令时有几千条数据。我的缓冲区是使用list列表。可是这样无法实现数据及时处理呀,除了你们上面说的几个办法,还有没有其他办法呀?真的很急呀,都搞了快一个月了,只是找到了原因,具体方法还没有找到呀!
发表于 2009-6-28 13:53:31 | 显示全部楼层
办法已经告诉你了呀。
1、判断架构是否合理,是否存在设计缺陷和明显的瓶颈
2、进行一下系统的性能测试,用工具查出代码性能缺陷位置,并加以改进
3、如果还是处理不过来,那就是超过了处理机的性能极限 - 一台计算机总是有处理极限的。增加处理机,进行分割。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 08:13 , Processed in 0.022328 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表