2022. 2. 17. 00:00ㆍCSharp/Advance
PLINQ(병렬 LINQ)는 LINQ(Language-Integrated Query) 패턴의 병렬 구현
병렬쿼리
기본적으로 LINQ 와 같다. (IEnumerable 또는 IEnumerable<T> 를 통한 지연처리)
다른점은 시스템에서 모든 프로세서를 충분히 활용하도록 시도한다
ParrallelEnumerable
: 거의 모든 PLINQ 기능을 노출
PLINQ에 대한 진입점입니다. 가능한 경우 나머지 쿼리가 병렬화되어야 한다는 것을 지정합니다.
비병렬 LINQ 쿼리로 나머지 쿼리가 순차적으로 실행되어야 한다는 것을 지정합니다.
PLINQ가 나머지 쿼리에 대해 또는 순서 지정이 변경될 때까지 소스 시퀀스의 순서 지정(예: OrderBy(Visual Basic에서 Order By) 절의 사용에 따라)을 유지해야 한다는 것을 지정합니다.
쿼리의 나머지 부분에 대해 소스 시퀀스의 순서 지정을 유지하기 위해 PLINQ가 필요 없음을 지정합니다.
PLINQ가 제공된 취소 토큰의 상태를 주기적으로 모니터링하고 요청되는 경우 실행을 취소해야 한다는 것을 지정합니다.
PLINQ에서 쿼리를 병렬화하는 데 사용해야 하는 프로세서의 최대 수를 지정합니다.
가능한 경우 PLINQ가 병렬 결과를 소비 스레드에서 하나의 시퀀스로 다시 병합해야 하는 방법에 대한 힌트를 제공합니다.
기본 동작이 순차적으로 실행해야 하는 경우 PLINQ에서 쿼리를 병렬화해야 하는지 여부를 지정합니다.
쿼리 결과 반복과 달리 소비자 스레드로 다시 병합하지 않고 병렬로 처리될 결과를 활성화하는 다중 스레드 열거형 메서드.
Aggregate 오버로드
PLINQ에 고유하고 스레드 로컬 파티션에 대한 중간 집계뿐만 아니라 모든 파티션의 결과를 결합하는 최종 집계 함수를 활성화하는 오버로드.
기본 사용법
var source = Enumerable.Range(1, 10000);
// PLINQ with AsParallel.
var evenNums = from num in source.AsParallel()
where num % 2 == 0
select num;
Console.WriteLine("{0} even numbers out of {1} total",
evenNums.Count(), source.Count());
//output
//5000 even numbers out of 10000 total
사용하는 Process 의 수 지정하기
var query = from item in source.AsParallel().WithDegreeOfParallelism(2)
where Compute(item) > 42
select item;
var query = from site in new[]
{
"www.albahari.com",
"www.linqpad.net",
"www.oreilly.com",
"stackoverflow.com",
}
.AsParallel().WithDegreeOfParallelism(4)
let p = new Ping().Send(site)
select new
{
site,
Result = p.Status,
Time = p.RoundtripTime
};
foreach(var item in query) Console.WriteLine($"{item.site}\n{item.Result}\n{item.Time}");
WithDegreeOfParallelism 여러번 호출 하기
var data = "The Quick Brown Fox"
.AsParallel().WithDegreeOfParallelism(2)
.Where(c => !char.IsWhiteSpace(c))
.AsParallel().WithDegreeOfParallelism(3) // Forces Merge + Partition
.Select(c => char.ToUpper(c));
foreach(var item in data) Console.WriteLine(item);
순서가 정렬되도록 쿼리 지정
var numbers = Enumerable.Range(1, 100);
var orderedEvenNums =
from num in numbers.AsParallel().AsOrdered()
where num % 2 == 0
select num;
foreach (var num in orderedEvenNums) Console.WriteLine($"{num}");
// 2,4,6,8,.... 100
// 만약 AsOrdered 가 없다면 순서는 random 할 수 있다. (6,8,4,2,10 ...)
순서가 순차적으로 전달되어야 하는 쿼리(이전값이 다음값에 영향을 준다거나 하는등의) 는
AsSequencial 을 통해 순차적으로 실행되도록 한다.
관련영상
'CSharp > Advance' 카테고리의 다른 글
Abstract Factory (0) | 2022.02.21 |
---|---|
Parallel Programming (PLINQ Optimizing and Parallel Class) (0) | 2022.02.18 |
Parallel Programming (TPL Dataflow) (0) | 2022.02.16 |
Parallel Programming (TPL) (0) | 2022.02.15 |
Parallel Programming (Thread) (0) | 2022.02.14 |