2016-06-07 1 views
0

postcodes을 기반으로 Geolocation 정보를 얻으려면 postcodes.io api를 사용하고 있습니다. 괜찮 았어. 그러나이 API에는 요청 당 100 개의 엽서 만 허용 할 수 있다는 제한이 있습니다. 약 300 개의 우편 번호가 있습니다. API를 병렬로 호출하고 모든 것을 가져온 후에 응답을 집계 할 생각입니다.병렬 프로그래밍을 사용하여 외부 API에서 Geolocation 정보 얻기

var httpClient = _httpClientFactory.GetHttpClient("GeolocationAPI", postCodeServiceUrl, _httpLogger); 

      // chunks the list by 100 items and returns the collection 
      var postcodeChunks = postcodes.ChunkBy(100); 
      postcodeChunks.ForEach(
       postcodeList => 
        { 
         var response = httpClient 
          .Post 
          <MultipleGeolocationInfoRequest, 
           GetGeolocationResult<GetGeolocationResult<GeolocationInfo>[]>>(
            "postcodes", 
            new MultipleGeolocationInfoRequest {Postcodes = postcodeList.ToArray()}); 
        } 
       ); 

ChunkBy 확장 메소드리스트의 목록을 반환하고, 각리스트는 우편 번호 (100)를 포함.

반송 응답을 집계하고 예외가있는 경우 처리하는 데 어려움이 있습니다. 각 통화의 response도 컬렉션입니다.

API : http://postcodes.io/

+0

완전히 IO 바인딩 작업이므로 별도의 스레드에서 실행하는 대신 비동기 메서드를 사용하는 것이 좋습니다. IO 부분은 본질적으로 추가 스레드를 차단하지 않고 병렬로 실행됩니다. – juharr

+0

감사합니다. 그것을 설명하는 링크를 공유 할 수 있습니까? 나는 이것에 아주 새롭다. – Venky

+0

@juharr OP는 요청을 병렬로 실행하지 않습니다. 병렬로 실행하는 것이 좋습니다 ('Parallel.ForEach' 또는'Task.WhenAll'). –

답변

0
먼저 결과의 집합으로 그들을 수집 할 수 집계 결과에

SelectMany보다 : 코드가 전혀 평행하지 않은

 List<Poscode[]> responses = new List<Poscode[]>(); 
     postcodeChunks.ForEach(
      postcodeList => 
       { 
        try // handle exception for individual call 
        { 
        var response = httpClient.Post(....); 
        responses.Add(response); 
        } 
        catch(Exception ex) 
        { 
         // do something sensible with exception for request 
         // continue or abort (with throw) 
        } 
       } 

      // merge all results into single list 
      var aggregated = results.SelectMany(x => x).ToList(); 

주 - Parallel.ForEach 또는 asycn 사용을 고려 모든 작업을 병렬로 실행하려면 Task.WhenAll의 코드를 사용하십시오.

관련 문제