데이터 병렬 처리(작업 병렬 라이브러리)
데이터 병렬 처리는 소스 컬렉션 또는 배열의 요소에 대해 동일한 작업이 동시에, 즉 병렬로 수행되는 시나리오를 가리킵니다. 명령적 구문을 통한 데이터 병렬 처리는 System.Threading.Tasks.Parallel 클래스에 있는 For 및 ForEach 메서드의 여러 오버로드에서 지원됩니다. 데이터 병렬 작업에서는 소스 컬렉션이 분할되므로 여러 스레드에서 서로 다른 세그먼트에 대해 동시에 작업을 수행할 수 있습니다. TPL은 System.Threading.Tasks.Parallel 클래스를 통해 데이터 병렬 처리를 지원합니다. 이 클래스에서는 for 및 foreach 루프(Visual Basic의 경우 For 및 For Each)에 대한 메서드 기반 병렬 구현을 제공합니다. Parallel.For 또는 Parallel.ForEach 루프에 대한 루프 논리를 작성하는 방법은 순차 루프를 작성할 때와 상당히 비슷합니다. 스레드 또는 큐 작업 항목은 만들지 않아도 됩니다. 기본적인 루프에서는 잠금을 가져올 필요가 없습니다. TPL에서는 하위 수준의 모든 작업을 자동으로 처리합니다. 다음 코드 예제에서는 간단한 foreach 루프와 이에 해당하는 병렬 루프를 보여 줍니다.
참고 |
---|
이 문서에서는 람다 식을 사용하여 TPL의 대리자를 정의합니다.C# 또는 Visual Basic의 람다 식에 익숙하지 않은 경우 PLINQ 및 TPL의 람다 식을 참조하십시오. |
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
병렬 루프가 실행되면 TPL에서는 해당 루프가 여러 부분에서 동시에 작동할 수 있도록 데이터 소스를 분할합니다. 내부적으로는 작업 스케줄러가 시스템 리소스 및 작업 부하에 따라 작업을 분할합니다. 작업 부하가 균일하지 않게 될 경우 스케줄러에서는 가능하면 작업을 여러 스레드 및 프로세서에 다시 분산합니다.
참고 |
---|
고유한 사용자 지정 파티셔너나 스케줄러를 지정할 수도 있습니다.자세한 내용은 PLINQ 및 TPL에 대한 사용자 지정 파티셔너 및 작업 스케줄러를 참조하십시오. |
Parallel.For 메서드와 Parallel.ForEach 메서드에는 루프 실행 중지 또는 중단, 다른 스레드의 루프 상태 모니터링, 스레드 로컬 상태 유지, 스레드 로컬 개체 종료, 동시성 수준 제어 등의 작업을 수행하는 데 사용할 수 있는 몇 가지 오버로드가 포함되어 있습니다. 이 기능을 사용할 수 있는 도우미 형식으로는 ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken 및 CancellationTokenSource가 있습니다.
자세한 내용은 데이터 병렬 처리(작업 병렬 라이브러리)를 참조하십시오.
명령적 구문 또는 쿼리와 유사한 구문을 통한 데이터 병렬 처리가 PLINQ에서 지원됩니다. 자세한 내용은 PLINQ(병렬 LINQ)를 참조하십시오.
관련 항목
제목 |
설명 |
---|---|
배열 또는 인덱싱 가능한 IEnumerable<T> 소스 컬렉션에 대한 For 루프를 작성하는 방법에 대해 설명합니다. |
|
모든 IEnumerable<T> 소스 컬렉션에 대한 ForEach 루프를 작성하는 방법에 대해 설명합니다. |
|
모든 스레드에 동작을 알리기 위해 병렬 루프를 중지하거나 병렬 루프에서 빠져 나오는 방법에 대해 설명합니다. |
|
각 스레드가 다른 스레드에 표시되지 않는 private 변수를 유지하는 For 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법에 대해 설명합니다. |
|
각 스레드가 다른 스레드에 표시되지 않는 private 변수를 유지하는 ForEach 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법에 대해 설명합니다. |
|
System.Threading.CancellationToken을 사용하여 병렬 루프를 취소하는 방법에 대해 설명합니다. |
|
루프 본문이 매우 작은 경우 실행 속도를 높일 수 있는 한 가지 방법에 대해 설명합니다. |
|
작업 병렬 라이브러리에 대한 개요를 제공합니다. |
|
.NET Framework의 병렬 프로그래밍에 대해 소개합니다. |