데이터 병렬 처리(작업 병렬 라이브러리)Data Parallelism (Task Parallel Library)

데이터 병렬 처리는 소스 컬렉션 또는 배열의 요소에서 동일한 작업이 동시에(즉, 병렬로) 수행되는 시나리오를 가리킵니다.Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. 데이터 병렬 작업에서 소스 컬렉션은 여러 스레드가 서로 다른 세그먼트에서 동시에 작동할 수 있도록 분할됩니다.In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.

TPL(작업 병렬 라이브러리)은 System.Threading.Tasks.Parallel 클래스를 통해 데이터 병렬 처리를 지원합니다.The Task Parallel Library (TPL) supports data parallelism through the System.Threading.Tasks.Parallel class. 이 클래스는 forforeach 루프(Visual Basic에서는 ForFor Each)의 메서드 기반 병렬 구현을 제공합니다.This class provides method-based parallel implementations of for and foreach loops (For and For Each in Visual Basic). 순차 루프를 작성하는 것과 마찬가지로 Parallel.For 또는 Parallel.ForEach 루프에 대한 루프 논리를 작성합니다.You write the loop logic for a Parallel.For or Parallel.ForEach loop much as you would write a sequential loop. 스레드나 큐 작업 항목을 만들 필요가 없습니다.You do not have to create threads or queue work items. 기본 루프에서는 잠금을 수행할 필요가 없습니다.In basic loops, you do not have to take locks. TPL에서 모든 하위 수준 작업을 자동으로 처리합니다.The TPL handles all the low-level work for you. Parallel.ForParallel.ForEach의 용도에 대한 심층 내용은 병렬 프로그래밍의 패턴: .NET Framework 4의 병렬 패턴 이해 및 적용 문서를 다운로드하세요.For in-depth information about the use of Parallel.For and Parallel.ForEach, download the document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. 다음 코드 예제에서는 간단한 foreach 루프 및 해당 병렬 루프를 보여 줍니다.The following code example shows a simple foreach loop and its parallel equivalent.

참고

이 문서에서는 람다 식을 사용하여 TPL에 대리자를 정의합니다.This documentation uses lambda expressions to define delegates in TPL. C# 또는 Visual Basic의 람다 식을 잘 모르는 경우 PLINQ 및 TPL의 람다 식을 참조하세요.If you are not familiar with lambda expressions in C# or Visual Basic, see Lambda Expressions in PLINQ and TPL.

// Sequential version            
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))

병렬 루프가 실행되는 경우 TPL은 루프가 동시에 여러 부분에서 작동할 수 있도록 데이터 소스를 분할합니다.When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. 내부적으로 작업 스케줄러는 시스템 리소스 및 작업에 따라 작업을 분할합니다.Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. 가능한 경우 스케줄러는 작업 불균형이 발생할 때 여러 스레드 및 프로세서 간에 작업을 재배포합니다.When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

참고

고유한 사용자 지정 파티셔너 또는 스케줄러를 제공할 수도 있습니다.You can also supply your own custom partitioner or scheduler. 자세한 내용은 PLINQ 및 TPL에 대한 사용자 지정 파티셔너작업 스케줄러를 참조하세요.For more information, see Custom Partitioners for PLINQ and TPL and Task Schedulers.

Parallel.ForParallel.ForEach 메서드 둘 다에는 루프 실행을 중지 또는 중단하고, 다른 스레드의 루프 상태를 모니터링하고, 스레드 로컬 상태를 유지 관리하고, 스레드 로컬 개체를 종료하고, 동시성 수준을 제어할 수 있도록 하는 여러 오버로드가 있습니다.Both the Parallel.For and Parallel.ForEach methods have several overloads that let you stop or break loop execution, monitor the state of the loop on other threads, maintain thread-local state, finalize thread-local objects, control the degree of concurrency, and so on. 이 기능을 사용할 수 있도록 하는 도우미 형식에는 ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationTokenCancellationTokenSource가 있습니다.The helper types that enable this functionality include ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, and CancellationTokenSource.

자세한 내용은 병렬 프로그래밍의 패턴: .NET Framework 4의 병렬 패턴 이해 및 적용을 참조하세요.For more information, see Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

선언적 또는 쿼리와 유사한 구문을 사용한 데이터 병렬 처리는 PLINQ에서 지원됩니다.Data parallelism with declarative, or query-like, syntax is supported by PLINQ. 자세한 내용은 PLINQ(병렬 LINQ)를 참조하세요.For more information, see Parallel LINQ (PLINQ).

제목Title 설명Description
방법: 간단한 Parallel.For 루프 작성How to: Write a Simple Parallel.For Loop 배열 또는 인덱싱 가능한 IEnumerable<T> 소스 컬렉션에 대한 For 루프를 작성하는 방법을 설명합니다.Describes how to write a For loop over any array or indexable IEnumerable<T> source collection.
방법: 간단한 Parallel.ForEach 루프 작성How to: Write a Simple Parallel.ForEach Loop IEnumerable<T> 소스 컬렉션에 대한 ForEach 루프를 작성하는 방법을 설명합니다.Describes how to write a ForEach loop over any IEnumerable<T> source collection.
방법: Parallel.For 루프 중지 또는 중단How to: Stop or Break from a Parallel.For Loop 모든 스레드가 작업 알림을 받도록 병렬 루프에서 중지 또는 중단하는 방법을 설명합니다.Describes how to stop or break from a parallel loop so that all threads are informed of the action.
방법: 스레드 로컬 변수를 사용하는 Parallel.For 루프 작성How to: Write a Parallel.For Loop with Thread-Local Variables 각 스레드가 다른 스레드에 표시되지 않는 전용 변수를 유지 관리하는 For 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법을 설명합니다.Describes how to write a For loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
방법: 파티션 로컬 변수를 사용하는 Parallel.ForEach 루프 작성How to: Write a Parallel.ForEach Loop with Partition-Local Variables 각 스레드가 다른 스레드에 표시되지 않는 전용 변수를 유지 관리하는 ForEach 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법을 설명합니다.Describes how to write a ForEach loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
방법: Parallel.For 또는 ForEach 루프 취소How to: Cancel a Parallel.For or ForEach Loop System.Threading.CancellationToken을 사용하여 병렬 루프를 취소하는 방법을 설명합니다.Describes how to cancel a parallel loop by using a System.Threading.CancellationToken
방법: 작은 루프 본문 속도 개선How to: Speed Up Small Loop Bodies 루프 본문이 매우 작을 때 실행을 가속화하는 한 가지 방법을 설명합니다.Describes one way to speed up execution when a loop body is very small.
TPL(작업 병렬 라이브러리)Task Parallel Library (TPL) 작업 병렬 라이브러리에 대해 간략하게 설명합니다.Provides an overview of the Task Parallel Library.
병렬 프로그래밍Parallel Programming .NET Framework의 병렬 프로그래밍을 소개합니다.Introduces Parallel Programming in the .NET Framework.

참고 항목See also