Queue的使用问题。 Queue队列异步多线程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 caozhy 于 2014-07-27 23:32:11 编辑 嗯,我之前也是用的while,后来想试试异步改成了ifwhile和if在这个问题上影响暂时还不是很大。帮我看看有什么方法能让取出的速度大于写入的速度。 if (appServer.DataQueue.Count > 0) 修改为if (appServer.DataQueue.Count > 0 && appServer.DataQueue.Count < xxx)如果插入过快,就让它阻塞下。 个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。把数据入库效率解决了,就没有啥问题了。 如果后台数据库使用的是sqlserver,可以考虑采用批量写入bulk insert。----------------------- 一个理发师10分钟服务一位客户,也就是一小时可以服务6位客户如果每小时新增10位客户,排队客户只会越积越多。简单的更改分号/叫号的方式(while/if等等),是不能解决客户越积越多的问题的。真正的解决方法就是:1、限制客户(你认为不可采用)2、增快处理速度。如何增快处理速度,要具体看你Common.InsertData的具体瓶颈在那里。1、如果瓶颈在于网络延时,可以采用多个DealDataQueue线程(多个理发师),或采用批处理的方式,比如服务端增加批处理支持Common.InsertMultiData。2、如果是数据库入库处理过长,则要优化数据库入库查询(提高理发师的速度)。另:你的queue没有同步,在多线程下有潜在问题。 个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。把数据入库效率解决了,就没有啥问题了。 如果后台数据库使用的是sqlserver,可以考虑采用批量写入bulk insert。-----------------------入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡? 你好,同步是Queue.Synchronized(queue)这样吗? Queue.Synchronized(queue)不够。因为你先判断Count ,然后Dequeue,这是两个操作。两个操作需要在lock(queue.SyncRoot)保护下运行。 大致看了下,你很多地方使用了System.Threading.Thread.Sleep(5);也就是说,其他什么操作都不耗时间的话,你也就是执行200次/秒。你确认数据量这么小?否则,阻塞是肯定的,也就是出现你这种情况。 个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。把数据入库效率解决了,就没有啥问题了。 如果后台数据库使用的是sqlserver,可以考虑采用批量写入bulk insert。-----------------------入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?把性能瓶颈解决了,不需要进行平衡。不知道LZ在Server侧使用的哪种socket模块?从500扩展到1w客户端,Socket + Asynchronous估计撑不住还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,不处理会导致脏数据出来。 我程序是winform,不sleep界面会卡着。 个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。把数据入库效率解决了,就没有啥问题了。 如果后台数据库使用的是sqlserver,可以考虑采用批量写入bulk insert。-----------------------入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?把性能瓶颈解决了,不需要进行平衡。不知道LZ在Server侧使用的哪种socket模块?从500扩展到1w客户端,Socket + Asynchronous估计撑不住还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,不处理会导致脏数据出来。用的是江大鱼的SuperSocket。从今天跑的情况来看,未同步确实出现了问题。dequeue的东西转化的类型不对。 我程序是winform,不sleep界面会卡着。主线程的循环?可以用application。doevent试试。 关于堆栈、栈问题 翻牌小游戏的一组小代码 C# 的 datagridview 填充数据问题... 求《User Interfaces in Csharp Windows Forms and Custom Controls》! 请将下面这段remoting设置改成config配置格式,谢谢 小女子有事请教。。。!!!! 求xml schema标准中文版 急求向Word2003文件中插入图片的方法!在线急等!!!!!!!!!! 微软为何要提供更改private字段的方法? 如果用C#写应用工具,会得到多少支持?现在的.net framework的装机量不会太大吧 C#读取文件夹树结构 关于datatable合并的问题
while和if在这个问题上影响暂时还不是很大。
帮我看看有什么方法能让取出的速度大于写入的速度。
修改为
if (appServer.DataQueue.Count > 0 && appServer.DataQueue.Count < xxx)
如果插入过快,就让它阻塞下。
把数据入库效率解决了,就没有啥问题了。
如果后台数据库使用的是sqlserver,可以考虑采用批量写入
bulk insert。
-----------------------
如果每小时新增10位客户,排队客户只会越积越多。简单的更改分号/叫号的方式(while/if等等),是不能解决客户越积越多的问题的。
真正的解决方法就是:
1、限制客户(你认为不可采用)
2、增快处理速度。如何增快处理速度,要具体看你Common.InsertData的具体瓶颈在那里。1、如果瓶颈在于网络延时,可以采用多个DealDataQueue线程(多个理发师),或采用批处理的方式,比如服务端增加批处理支持Common.InsertMultiData。
2、如果是数据库入库处理过长,则要优化数据库入库查询(提高理发师的速度)。另:你的queue没有同步,在多线程下有潜在问题。
把数据入库效率解决了,就没有啥问题了。
如果后台数据库使用的是sqlserver,可以考虑采用批量写入
bulk insert。
-----------------------
入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
Queue.Synchronized(queue)不够。
因为你先判断Count ,然后Dequeue,这是两个操作。
两个操作需要在lock(queue.SyncRoot)保护下运行。
System.Threading.Thread.Sleep(5);
也就是说,其他什么操作都不耗时间的话,你也就是执行200次/秒。
你确认数据量这么小?
否则,阻塞是肯定的,也就是出现你这种情况。
把数据入库效率解决了,就没有啥问题了。
如果后台数据库使用的是sqlserver,可以考虑采用批量写入
bulk insert。
-----------------------
入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
把性能瓶颈解决了,不需要进行平衡。
不知道LZ在Server侧使用的哪种socket模块?
从500扩展到1w客户端,Socket + Asynchronous估计撑不住
还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,
不处理会导致脏数据出来。
把数据入库效率解决了,就没有啥问题了。
如果后台数据库使用的是sqlserver,可以考虑采用批量写入
bulk insert。
-----------------------
入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
把性能瓶颈解决了,不需要进行平衡。
不知道LZ在Server侧使用的哪种socket模块?
从500扩展到1w客户端,Socket + Asynchronous估计撑不住
还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,
不处理会导致脏数据出来。
用的是江大鱼的SuperSocket。
从今天跑的情况来看,未同步确实出现了问题。dequeue的东西转化的类型不对。