sla*_*shp 28 c# multithreading threadpool c#-4.0
我最近一直在阅读很多关于线程的内容,因为我正在寻找能够处理多达10,000-20,000个客户端的高性能,可扩展的TCP服务器,每个客户端都通过基于命令的方式与服务器进行双向通信.系统.服务器将接收命令,并根据命令执行单个(或多个)任务.我的问题是如何在各种情况下适当地使用.NET线程构造,执行可能需要一分钟到几个小时的任务,具体取决于正在执行的工作.
最令我困惑的是,无论我在哪里阅读,我都会看到"使用手动创建的线程(或自定义线程池)来处理'长期运行'任务,并使用TPL执行短期任务或任务需要并行处理." 究竟什么是长期任务?这是5秒,60秒,一小时吗?
我应该在什么时间框架中使用这三种创建线程的方法:
我想到的另一个问题如下 - 说我的服务器实际上连接了20,000个客户端,每个客户端每秒发送1个命令(可以转换为一个或多个任务).即使使用强大的硬件,我也不可能将过高的工作负载推送到我拥有的任何线程池/工作项队列中,从而最终在队列缓慢填充到最大值后生成OutOfMemoryException?
任何见解将不胜感激.
Mar*_*ell 18
实际上,对于那种情况,所有这些都是次要的; 你要看的第一件事是asyc-IO,又名.BeginRead(...)等; 这允许您通过等待IO完成端口来最小化线程数 - 更高效.
一旦你有一个完整的消息,该尺度的我会把这个消息到自定义线程池/同步队列.我将有一个受控数量的常规线程(不是池线程或IOCP)服务该队列来处理每个项目.
碰巧我正在做类似的事情(规模较小); 为了防止内存爆炸,我已经限制了工作队列; 如果它已满(即工作人员无法跟上),那么你可能会暂时阻止IOCP,也许最终会超时,告诉客户端在IOCP层"太忙".
Hen*_*man 10
最令我困惑的是,无论我在哪里阅读,我都会看到"使用手动创建的线程(或自定义线程池)来处理'长期运行'任务,并使用TPL执行短期任务或任务需要并行处理."
奇怪的建议,或者你可能误引了一点.线程也能够并行处理,使用TPL,您可以使用LongRunning选项创建任务.剩下的是你不应该在ThreadPool上启动长任务.
究竟什么是长期任务?这是5秒,60秒,一小时吗?
TPL在ThreadPool之上运行,TP将以每秒2个的最大值创建新的线程.所以长时间运行> = 500 ms
即使使用强大的硬件,我也没有机会将过高的工作量推入到我拥有的任何线程池/工作项队列中,
是的,没有线程工具可以扩展您的实际容量......
对于20k客户端,您可能需要一个服务器场,可以选择早期包含在您的设计中......
所以你应该在深入了解套接字之前给WCF一个好看.
马克斯的建议就是我这样做的方式.但是,如果任务花费的时间超过一秒,并且客户端每秒发送一个请求,则队列将稳步增加.
在这种情况下,我将使用一个服务器作为外观,它从客户端获取所有请求,并以异步方式将响应发送回它们.
服务器会将所有请求放入一个由其他几个服务器读取的消息队列中.这些服务器处理请求并将响应放入另一个由第一个服务器读取的消息队列中.
另一种解决方案是使用负载平衡服务器.