C#控制台在多处理模式(Parallel.ForEach)下调用RESTAPI的次数超过100k次
我正在使用Parallel.ForEach以批处理模式调用rest api服务,比如一次调用1000个请求。 我的MaxDegreeOfParallelism设置为1000,但似乎系统一次只创建10-15个请求,尽管系统CPU利用率非常正常(15%)C#控制台在多处理模式(Parallel.ForEach)下调用RESTAPI的次数超过100k次,c#,multithreading,parallel.foreach,C#,Multithreading,Parallel.foreach,我正在使用Parallel.ForEach以批处理模式调用rest api服务,比如一次调用1000个请求。 我的MaxDegreeOfParallelism设置为1000,但似乎系统一次只创建10-15个请求,尽管系统CPU利用率非常正常(15%) 是否有任何方法可以一次发出1000个请求,以避免在非阻塞模式下的大量等待时间。您缺少线程池线程。一个快速的解决方法是使用该方法增加初始工作人员池 更好的方法是异步调用RESTAPI。这样,在请求进行中对工作线程的需求将被消除。协调异步过程的一个优秀
是否有任何方法可以一次发出1000个请求,以避免在非阻塞模式下的大量等待时间。您缺少
线程池
线程。一个快速的解决方法是使用该方法增加初始工作人员池
更好的方法是异步调用RESTAPI。这样,在请求进行中对工作线程的需求将被消除。协调异步过程的一个优秀工具是库。您可以看到此库的使用示例。理智的web开发人员希望您一次调用他们的api 1000是什么?此外,TPL
ForEach
和For
方法完全不适合此项工作,您实际上是在制作一个非常低效的线程池线程阻塞工具,因此任务调度器将对这些任务视而不见,并严重限制您的IO工作您需要研究异步和等待模式,为什么它是可伸缩的,以及它对IO工作的好处对于异步http(IO)请求使用Parallel
/TPL可能有些过分。没有必要加速那些任务
s。
var maxDegree = new ParallelOptions() { MaxDegreeOfParallelism = MaxDegreeOfParallelism };
Parallel.ForEach(parsedLines, maxDegree, obj =>
{
processIndividualRecord(obj);
var currentCount = Interlocked.Increment(ref paraaleCounter);
if (currentCount % 100 == 0)
{
logger.Debug("Reaming records to process is:" + (parsedLines.Count - currentCount));
}
});
ThreadPool.SetMinThreads(1000, 10);