[C#] 병렬 프로그래밍 Parallel Programming | 김예건님

사실 아직 저는 병렬 프로그래밍과 비동기 프로그래밍의 차이를 잘 모르기 때문에 Task만 사용하여 병렬처리를 하고 있습니다. 어차피 멀티스레드, 멀티코어를 사용한다는 맥락에서 같아보이기 때문입니다.

아시겠지만 Parallel로 파티셔닝 하여 작업 처리를 하는 부분도 Skip,Take와 Task로 동일하게 구현가능합니다. 코드 가독성이 더 좋아서 저는 그냥 Task로 작업하는 편인데, 저희 회사에서 주로 병렬처리가 필요한 부분을 예로 들면,

전자상거래 플랫폼의 OpenAPI의 설계가,

  1. 특정 기간을 지정하여 그 기간 안에 등록된 상품의 ID만 전부 수신
  2. 수신된 상품ID의 상세 정보를 가져오는 API 호출 시 1회 호출당 최대 50개까지만 사용가능 할 때, 상품이 10000개가 등록되어있다면 API는 200번~10000번을 호출할 수 있게됩니다. (API 1회 호출당 상품ID를 1개씩만 사용한다면 10000번 호출해야하고 50개씩 사용한다면 200번 호출해야합니다.)
  3. 이 때 10000개에 대해 Linq로 Skip, Take를 이용해 50개씩 반복해주고, Task.Run으로 API를 호출하며, 이 Task를 List로 등록하여 Task.WhenAll 처리합니다.

글로 설명드린 코드 예제는 아래와 같은 방식입니다.

        static async Task Main(string[] args)
        {
            List<int> ids = new(10000);

            for (int i = 0; i < 10000; i++)
            {
                ids.Add(i);
            }

            int idx = 0;
            List<Task> tasks = new();

            while (idx < 100)
            {
                IEnumerable<int> partition = ids.Skip(idx).Take(50);
                tasks.Add(Task.Run(() =>
                {
                    foreach (var item in partition)
                    {
                        Console.WriteLine(item);
                    }
                }));
                idx += 50;
            }

            await Task.WhenAll(tasks);
        }

병렬처리와 비동기의 차이점에 대해서 갖고 계신 지식을 나눠주시면 감사드리겠습니다…

3 Likes