사실 아직 저는 병렬 프로그래밍과 비동기 프로그래밍의 차이를 잘 모르기 때문에 Task만 사용하여 병렬처리를 하고 있습니다. 어차피 멀티스레드, 멀티코어를 사용한다는 맥락에서 같아보이기 때문입니다.
아시겠지만 Parallel로 파티셔닝 하여 작업 처리를 하는 부분도 Skip,Take와 Task로 동일하게 구현가능합니다. 코드 가독성이 더 좋아서 저는 그냥 Task로 작업하는 편인데, 저희 회사에서 주로 병렬처리가 필요한 부분을 예로 들면,
전자상거래 플랫폼의 OpenAPI의 설계가,
- 특정 기간을 지정하여 그 기간 안에 등록된 상품의 ID만 전부 수신
- 수신된 상품ID의 상세 정보를 가져오는 API 호출 시 1회 호출당 최대 50개까지만 사용가능 할 때, 상품이 10000개가 등록되어있다면 API는 200번~10000번을 호출할 수 있게됩니다. (API 1회 호출당 상품ID를 1개씩만 사용한다면 10000번 호출해야하고 50개씩 사용한다면 200번 호출해야합니다.)
- 이 때 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);
}
병렬처리와 비동기의 차이점에 대해서 갖고 계신 지식을 나눠주시면 감사드리겠습니다…