我有一个返回20个产品的GetProducts方法。每个产品都需要相当长的时间来创建(来自许多地方的许多资源)。
您是否建议启动20个不同的线程(使用线程池队列)来处理每个产品的创建?
这会在很多负载下瘫痪服务器吗?我的应用程序存在高负载的风险。
我提出这个问题的原因是因为我实际上已经实现了这样的功能,并且在进行负载测试时,我的服务器会受到瘫痪并需要完全重新启动才能恢复正常运行。
我缺少一种方法吗?我完全错了吗?我应该坚持同步处理吗?
注意:在进行负载测试时,服务器内存的使用方式很多,有时会抛出错误(服务器内存不足)。垃圾收集器的工作速度不够快吗?
此外,我的产品是从商业服务器(自动缓存)加载的,但我需要将大量资源附加到产品(图像,文档,评论等)。
此外,我的架构是一个双层设置,网络前端完全位于wcf服务(执行线程)。 wcf层正在瘫痪。服务器在8核服务器上是虚拟的,分配了ram gb。
个人提示我有一种感觉,我在滥用多重问题。对“GetProducts”的调用应该是异步的,但“GetProducts”不应该进行20次异步操作。
答案 0 :(得分:2)
即使你受CPU限制,旋转20个线程可能也是过度杀伤,除非你有20个核心并且可以将它们专用于此 - 即。不是asp.net,它已经是高度线程化的。
添加线程也会使同步变得困难 - 我想知道你当前的实现是否已经死锁。
如果te数据来自不同的地方,那么异步是有意义的,但可能过头了。在某些方面,使用池线程可能是诱人的,这不会完全从整个系统中窃取处理器(池有一些内置的健全性,并且通常使用< 20个线程来为20个项目提供服务)。
答案 1 :(得分:1)
可能值得考虑将这些产品缓存在内存中的方法。如果他们花费很长时间来创建,但不经常更改,您可以在服务器启动时或根据需要创建它们,或者让另一个进程创建它们并填充您的Web服务器读取的缓存。
正如Marc所提到的,除非你有20个内核专门用于这个PER CONCURRENT客户端,否则你真的不会因此而获得太多收益。我尽量避免在我的Web服务器中使用多线程代码,因为如果你不小心它会导致死锁。