2016-10-17 3 views
0

이 코드는 대기 시간을 줄이기 위해 동시에 데이터를 가져 오는 2 ~ 7 건의 요청을 전송합니다. 내 컴퓨터에서 코드를 실행하는 데 6 초가 걸렸습니다. Azure에 업로드했을 때 60 초가 걸렸습니다. Azure 버전의 2 개의 창을 열고 나란히 실행하면 120 초가 걸립니다. 나에게 그들이 원하는대로 동시에 실행되지 않거나 동시에 여러 호출이 서버에 병목 현상을 일으키고 있다고 생각됩니다. 누구든지 아이디어가 있습니까? 그들이 병렬 처리 수준을 선택하는 CPU 기반 추론을 사용하기 때문에Task.Parallel.For가 병렬로 실행되지 않는 것 같습니다.

List<string> strs = new List<string>(); 
Parallel.For(0, uriArray.Count(), index => 
{ 
    using (var client = new HttpClient()) 
    { 
     var response = client.GetAsync(uriArray[index]).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var responseContent = response.Content; 
      var responseString = responseContent.ReadAsStreamAsync().Result; 

      using (GZipStream zip = new GZipStream(responseString, CompressionMode.Decompress, true)) 
      using (StreamReader unzip = new StreamReader(zip)) 
      { 
       strs.Add(unzip.ReadToEnd()); 
      } 
     } 
    } 
}); 
+2

시스템에 몇 개의 코어가 있습니까? – Shyju

+0

@Shyju 내 컴퓨터에 8 개 있음 – Mike

+1

Azure에서는 어떨까요? –

답변

1

Parallel.* 방법은 CPU 바인딩 작업을 의미한다. IO 기반 작업의 경우 이러한 휴리스틱은 완전히 실패합니다. IO 에 대한 최적 DOP는 경험적으로 결정해야합니다.. CPU 코어의 수에서 파생 될 수 없습니다.

는 VM에만이 1

을 가지고 당신은 간다. 더 작은 VM에서는 HTTP 호출이 덜 자주 발생하므로 HTTP 호출이 CPU를 거의 소비하지 않기 때문에 말도 안되는 것은 분명합니다.

https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/의 마지막 코드를 사용하여 고정 된 병렬 처리 수준으로 작업 항목을 처리하십시오. 추가 혜택으로 .Result 통화가 풀릴 수 있습니다.

.NET 프레임 워크에는 아무것도 없기 때문에 블로그에서이 코드를 사용해야합니다.

관련 문제