[英]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.