[英]Concurrently running multiple tasks C#
我在IIS中拥有REST Web API服务,该服务接受请求对象的集合。 用户可以输入100多个请求对象。
我想同时运行这100个请求,然后汇总结果并发回。 这涉及到I / O操作(为每个请求调用后端服务)和CPU绑定操作(以计算少量响应元素)
代码段-
using System.Threading.Tasks;
....
var taskArray = new Task<FlightInformation>[multiFlightStatusRequest.FlightRequests.Count];
for (int i = 0; i < multiFlightStatusRequest.FlightRequests.Count; i++)
{
var z = i;
taskArray[z] = Tasks.Task.Run(() =>
PerformLogic(multiFlightStatusRequest.FlightRequests[z],lite, fetchRouteByAnyLeg)
);
}
Task.WaitAll(taskArray);
for (int i = 0; i < taskArray.Length; i++)
{
flightInformations.Add(taskArray[i].Result);
}
public Object PerformLogic(Request,...)
{
//multiple IO operations each depends on the outcome of the previous result
//Computations after getting the result from all I/O operations
}
如果我单独运行PerformLogic操作(针对1个对象)需要300毫秒,现在我的要求是,当我在单个请求中针对100个对象运行此PerformLogic()时,应该需要2秒钟左右。
PerformLogic()具有以下步骤-1.调用第三方Web服务以获取一些详细信息2.根据详细信息,调用另一个第三方Web服务3.从Web服务中收集结果,进行少量转换
但是使用Task.run()大约需要7秒钟,我想知道处理并发并达到2秒钟所需NFR的最佳方法。 我可以看到在任何时候7-8个线程可以同时工作
不知道我是否可以生成100个线程或任务,我们可以看到一些更好的性能。 请提出一种有效处理此问题的方法。
从这个判断
public Object PerformLogic(Request,...)
{
//multiple IO operations each depends on the outcome of the previous result
//Computations after getting the result from all I/O operations
}
我敢打赌, PerformLogic
将大部分时间都花在等待IO操作上。 如果是这样,那么async
就有希望。 您将不得不重写PerformLogic
甚至可能是IO操作-从上到下的所有级别都必须存在async
。 但是, 如果可以做到,结果应该会快得多。
除此之外-获得更快的硬件。 如果8核耗时7秒,则获得32核。 它很昂贵,但仍可能比重写代码便宜。
首先,不要重新发明轮子。 PLINQ完全可以并行处理事务,无需手动任务处理或结果合并。
如果您要100个任务在2秒内完成300毫秒,那么您至少需要15个并行工作器, 而忽略了并行化本身的成本 。
var results = multiFlightStatusRequest.FlightRequests
.AsParallel()
.WithDegreeOfParallelism(15)
.Select(flightRequest => PerformLogic(flightRequest, lite, fetchRouteByAnyLeg)
.ToList();
现在,您已经告诉PLinq使用15个并发工作器来处理您的任务队列。 您确定您的机器可以完成任务吗? 您可以在其中输入任何数字,这并不意味着您的计算机可以神奇地执行此操作。
另一个选择是查看PerformLogic
方法并对其进行优化。 您称之为100次,也许值得优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.