1

문서 ID 목록이 있고 웹 서비스에서 문서를 검색하려고한다고 가정 해보십시오. 나는 TPL을 가진 초보자이고 내가 google에 실패한 몇 가지 모범 사례에 관심이있다.TPL을 사용한 병렬 I/O

PLINQ의 AsParallel()은 소스 ID 목록을 분할하여 하나의 파티션에서 문서를 하나씩 검색하므로 적합하지 않습니다.

LINQ의 Select() 메서드를 사용하여 목록을 Task<Document> 목록으로 변환 한 다음 WaitAll()으로 변환해야합니까?

Parallel 클래스 및 AsParallel() 확장 방법은 모두 Task<T> 아래에 사용 하시겠습니까? Task(Action<Object>, Object) 과부하로 전달하는 것처럼 로컬 상태를 대리인에게 전달할 수 있습니까?

답변

2

병렬 처리 수준 (DOP)을 정확하게 제어 할 수 없기 때문에 IO 용 AsParallel을 사용하는 것은 위험합니다. 귀하의 입출력 장치는 특정 최적의 DOP를 가지지 만 이것은 TPL이 사용할 것과 다릅니다.

또한 네트워크 기능을 호출 할 때 TPL은 프로세서 수보다 많은 스레드를 사용합니다. 이는 네트워크의 과포화 및 최적의 처리량을 초래합니다. 또한 시간 초과로 이어질 수 있습니다. 나는 그것의 연약한 성격 때문에 생산으로 그런 것을 두지 않을 것입니다.

TPL에서 스레드 수를 선택하는 알고리즘은 완전히 명확하지 않습니다. 나는 CPU가 처리량을 증가시키는 것보다 더 많은 스레드를 추가하는 것을 탐지하려고 시도한다고 생각한다. 그러나 IMHO는 CPU 수보다 적게 사용하지 않을 것입니다. 이미징 64 스레드 웹 서비스를 망치.

정확한 병렬 처리가 필요한 경우 원하는 수의 작업/스레드를 직접 만드는 것이 좋습니다. 이 코드를 재사용 가능한 도우미 함수 ("ParallelForeachWithExactDOP")에 넣을 수 있습니다.

내 권장 사항 : 당신이 병렬로 모든 것을 실행하여 과포화 및 시간 초과를 위험에 빠뜨리는 경우, Select를 사용하여 모든 작업을 한 번에 생성 할 수 있습니다. 작업 수가 정상 범위 (예 : 문서가 최대 10 개)라는 것을 알고있는 경우에만이 작업을 수행해야합니다.

당신이 사용할 수있는 트릭은 다음과 같습니다. 문서를 청크 10 개로 나눕니다. foreach 청크를 사용하면 모든 작업을 한 번에 생성하고 모두 완료 될 때까지 기다릴 수 있습니다. 이렇게하면 한 번에 10 개의 작업 만 수행 할 수 있습니다. 이 방법은 상당히 간단합니다. 그러나 대부분의 경우 10 개 미만의 작업이 실행되고 때로는 아무 작업도 수행되지 않기 때문에 최적의 처리량을 제공하지 못합니다. 이것을 간단한 초보자 기술이라고 생각하십시오.

+0

감사합니다. 매우 유용합니다! 필자의 경우, 타사 API (웹 서비스)는 사용자 시나리오가 여러 문서 검색을 허용하는 동안 get-by-id 메서드 만 노출합니다. 그래서 아마 수동으로 작업 산란은 나에게 더 좋을 것이다. 특히 AsParallel()에 로컬 상태를 전달할 수 없다면 말이다. – UserControl

+0

한 번에 많은 문서를 전달하면 발신자에게 시간 초과가 표시됩니다. 그들은 또한 타임 아웃을 보지 못할 수도 있지만 동일한 웹 서비스의 _other_ 클라이언트는 심각한 속도 저하를 볼 수 있습니다. – usr

1

병렬화를위한 좋은 타겟인지 확실치 않은 병목 현상은 일반적인 클라이언트 네트워크 연결이 될 것입니다. 여기에서 말할 수는 없지만 사용하지 않은 용량이 많거나 (네트워크를 위험에 빠뜨릴 수있는 위험이없는 경우) 한 문서에 대한 요청이 차단되어 다른 작업을 할 수있는 이유가있는 경우가 아니라면 많은 것을 얻지 못할 것이라고 생각하지 마십시오. 이것에서.

웹 서비스에 의한 병렬 처리, 그건 바보가 될 것입니다.

+0

불행히도 나는 많은 선택권이 없습니다. 내 UI는 웹 응용 프로그램이므로 사용자는 제 3 자 서버가로드를 처리 할 수 ​​있기를 기대하면서 병렬로 수행하려고 시도하는 대신 백엔드에서 하나씩 문서를 요청할 때 브라우저 시간 초과를 볼 수 있습니다. – UserControl

+0

백엔드. 흠, 어디로 가는지 봅니다. 이 작업을 시작하기 전에 필자는 병렬로 진행되는 속도가 대폭 빨라졌고, 그렇다면 필자는 n 개의 "문서 팩"요청에 대한 네트워킹 요구를 대폭 늘릴 수있는 역량이 있음을 알고 있습니다. 시간 초과를 피하기 위해 일종의 진행 메커니즘을 살펴볼 것이라고 생각합니다. 이동할 문서 수를 표시하고 다음 활동이 모두있을 때 사용하도록 설정합니다. –

관련 문제