C#控制台调用rest API 100k plus多处理模式(Parallel.ForEach)[重复]
Posted
技术标签:
【中文标题】C#控制台调用rest API 100k plus多处理模式(Parallel.ForEach)[重复]【英文标题】:C# Console call rest API 100k plus times in multiprocessing mode (Parallel.ForEach) [duplicate] 【发布时间】:2020-04-03 23:26:30 【问题描述】:我正在使用 Parallel.ForEach 以批处理模式调用 rest api 服务,例如一次 1000 个请求。 我的 MaxDegreeOfParallelism 设置为 1000 ,但似乎系统一次只创建 10-15 个请求,尽管系统 CPU 利用率非常正常 (15%)
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));
);
有什么方法可以一次发出 1000 个请求,以避免在非阻塞模式下等待时间过长。
【问题讨论】:
哪个理智的 Web 开发人员希望您一次调用他们的 api 1000?此外,TPLForEach
和 For
方法完全不适合这项工作,您实际上是在制作一个非常低效的线程池线程阻塞工具,因此任务调度程序将对这些任务采取模糊的看法并严重限制您的 IO工作
您需要研究 async 和 await 模式,为什么它可扩展,以及它如何使 IO 工作受益
【参考方案1】:
您缺少ThreadPool
线程。一个快速的解决方法是使用ThreadPool.SetMinThreads
方法增加初始工作人员池。
ThreadPool.SetMinThreads(1000, 10);
更好的方法是异步调用 REST API。这样,在请求运行时对工作线程的需求将被消除。 TPL Dataflow 库是协调异步进程的绝佳工具。可以看这个库here的使用示例。
【讨论】:
对异步 http (IO) 请求使用Parallel
/ TPL 可能是矫枉过正。没有必要启动那些Task
s。以上是关于C#控制台调用rest API 100k plus多处理模式(Parallel.ForEach)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java调用计算机摄像头照相(Rest API控制,方便远程拍照)
ReactJS 应用程序无法使用 REST API 调用获取数据