我有一个定期执行HTTP发布的应用程序(从SQL检索的数据)。每30秒生成最多50个线程并同时运行HTTP帖子。如果帖子失败,只要间隔设置为,它就会等待2倍。这将发生两次。例如,30s,60s然后是120s。
我正在使用普通Thread.Start()
来推动这个过程,但我发现在实时服务器上,它完全消灭了CPU。
我的问题如下:
谢谢,
凯尔
答案 0 :(得分:1)
您不应该使用线程来运行多个I / O流。由于这些线程主要是阻塞I / O,因此您可以更有效地使用非阻塞或异步I / O.不是让一个线程与一个服务器通话,而是与N个服务器进行一次线程通话。
由于您使用的是HttpWebRequest,因此您需要查看HttpWebRequest.BeginGetResponse和HttpWebRequest.BeginGetRequestStream。
答案 1 :(得分:1)
通常,使用ThreadPool 。
在每个.NET进程中都有一个线程池,一个准备好为你工作的线程池。你应该使用它。
出于原因,请参阅Thread vs ThreadPool或The .NET ThreadPool
简短的故事是:它比你现有的按需启动线程的方法更有效率,而且它对你的CPU更有利。
.NET还有一个简单易用的机制,用于将工作发送到线程池中的线程:ThreadPool.QueueUserWorkItem。
我不知道.NET线程池是如何在内部进行管理的,但我知道比我聪明的工程师已经完成了分析工作,以确定应该做什么,应该有多少个线程,它应该如何表现以免淹没CPU。是的,它专门设计为 以避免您描述的问题。如果线程池对ASPNET工作进程足够好,那对我的应用程序来说可能已经足够了。
也是你的。
答案 2 :(得分:0)
对不起,我对多线程HTTP帖子没有任何经验。
话虽如此,你使用哪个类用于HTTP帖子?
我想,它应该有以异步方式进行HTTP post的方法。
并且,如果这不起作用,您可以使用ThreadPool而不是创建自己的线程。
答案 3 :(得分:0)
是否真的有必要同时运行50个线程?
尝试限制生成的线程数量,只需10个线程,然后批量运行。
答案 4 :(得分:0)
我想知道你还有什么可能运行那些破坏性的CPU性能(例如效率低下的监控循环),或者它是否是一个页面文件抖动问题,因为你已经耗尽了内存。如果你的工人类有很多本地数据,你可以很快地吸收内存。
我已经使用HttpWebRequest做了类似的事情,并且能够在飞行中同时拥有大约100个同时连接,但此时我已经最大化了网络带宽和内存,尽管50个连接运行正常。我创建自己的线程而不是使用ThreadPool,因为我使用回调,因此我可以轻松跟踪线程状态,甚至在需要时中止线程。它还简化了从失败的连接重新启动 - 我只是将线程放回到挂起的线程队列中。
ThreadPool可以防止您启动太多线程,但我认为与网络连接响应延迟相比,线程创建开销是微不足道的,至少在我的经验中是这样。