병렬 처리 수준 (DOP)을 정확하게 제어 할 수 없기 때문에 IO 용 AsParallel을 사용하는 것은 위험합니다. 귀하의 입출력 장치는 특정 최적의 DOP를 가지지 만 이것은 TPL이 사용할 것과 다릅니다.
또한 네트워크 기능을 호출 할 때 TPL은 프로세서 수보다 많은 스레드를 사용합니다. 이는 네트워크의 과포화 및 최적의 처리량을 초래합니다. 또한 시간 초과로 이어질 수 있습니다. 나는 그것의 연약한 성격 때문에 생산으로 그런 것을 두지 않을 것입니다.
TPL에서 스레드 수를 선택하는 알고리즘은 완전히 명확하지 않습니다. 나는 CPU가 처리량을 증가시키는 것보다 더 많은 스레드를 추가하는 것을 탐지하려고 시도한다고 생각한다. 그러나 IMHO는 CPU 수보다 적게 사용하지 않을 것입니다. 이미징 64 스레드 웹 서비스를 망치.
정확한 병렬 처리가 필요한 경우 원하는 수의 작업/스레드를 직접 만드는 것이 좋습니다. 이 코드를 재사용 가능한 도우미 함수 ("ParallelForeachWithExactDOP")에 넣을 수 있습니다.
내 권장 사항 : 당신이 병렬로 모든 것을 실행하여 과포화 및 시간 초과를 위험에 빠뜨리는 경우, Select를 사용하여 모든 작업을 한 번에 생성 할 수 있습니다. 작업 수가 정상 범위 (예 : 문서가 최대 10 개)라는 것을 알고있는 경우에만이 작업을 수행해야합니다.
당신이 사용할 수있는 트릭은 다음과 같습니다. 문서를 청크 10 개로 나눕니다. foreach 청크를 사용하면 모든 작업을 한 번에 생성하고 모두 완료 될 때까지 기다릴 수 있습니다. 이렇게하면 한 번에 10 개의 작업 만 수행 할 수 있습니다. 이 방법은 상당히 간단합니다. 그러나 대부분의 경우 10 개 미만의 작업이 실행되고 때로는 아무 작업도 수행되지 않기 때문에 최적의 처리량을 제공하지 못합니다. 이것을 간단한 초보자 기술이라고 생각하십시오.
출처
2012-01-22 11:33:29
usr
감사합니다. 매우 유용합니다! 필자의 경우, 타사 API (웹 서비스)는 사용자 시나리오가 여러 문서 검색을 허용하는 동안 get-by-id 메서드 만 노출합니다. 그래서 아마 수동으로 작업 산란은 나에게 더 좋을 것이다. 특히 AsParallel()에 로컬 상태를 전달할 수 없다면 말이다. – UserControl
한 번에 많은 문서를 전달하면 발신자에게 시간 초과가 표시됩니다. 그들은 또한 타임 아웃을 보지 못할 수도 있지만 동일한 웹 서비스의 _other_ 클라이언트는 심각한 속도 저하를 볼 수 있습니다. – usr