2010-06-14 7 views
5

디자인 관련 질문이 있습니다. ThreadPool이 내가 작성한 클라이언트 프로그램에 적합한지를 알기 위해 약간의 피드백을 원합니다.스레드 풀 설계 질문

데이터베이스 레코드를 처리하는 서비스로 실행중인 클라이언트가 있습니다. 이러한 각 레코드에는 외부 FTP 사이트에 대한 연결 정보가 들어 있습니다. 기본적으로 전송할 파일의 대기열입니다. 그들 중 많은 수가 동일한 호스트에 있으며 다른 파일을 옮기는 것입니다. 따라서 나는 그들을 호스트별로 그룹화하고있다. 호스트마다 새 스레드를 만들 수 있기를 원합니다. 전송이 끝나면 정말로 신경 쓰지 않아도됩니다. 할당 된 모든 작업 (또는 시도)을 완료 한 다음 처리가 끝나면 종료하고 프로세스에서 사용한 모든 리소스를 정리합니다.

나는 10-25 개가 넘는 연결을 설정할 것으로 예상합니다. 전송 큐가 비면 프로그램은 큐에 레코드가 다시있을 때까지 대기합니다.

ThreadPool이 이에 적합한 후보입니까 아니면 다른 접근 방식을 사용해야합니까?

편집 : 대부분 서버에서 실행되는 유일한 중요한 사용자 지정 응용 프로그램입니다.

답변

2

설명했듯이 스레드 풀이 적합 할 것 같습니다.

문제 :

  1. 스레드 풀 스레드가 종료에 살아 프로세스를 유지하지 않습니다. 그것이 당신이 원하는 행동인지 확인하십시오.

  2. 이전 읽기에서는 응용 프로그램이 웹 응용 프로그램과 같은 연결을 incomping하기를 기다리고있을 때 오래 실행되는 작업으로 스레드 풀을 묶는 것이 좋지 않을 수 있습니다. 그러나, 당신은 헌신적 인 Windows 서비스를 실행하는 것처럼 들리지만, 나는 이것이 문제라고 생각하지 않습니다.

  3. 스레드 풀에서 10 개의 작업을 던지기 만해도 작업을 수행하는 데 10 개의 스레드가 즉시 발송된다는 것을 의미하지는 않습니다. --net과 o/s에 사용할 스레드의 수를 결정하는 것을 위임합니다. .

+0

+1 모든 추론에 동의하면 threadpool이 가장 적합합니다. – Walter

5

아니요, 스레드 풀이 적합하지 않습니다. 스레드 풀은 실제로 스레드 풀 풀의 가용성에 의존하기 때문에 "백그라운드 처리가 필요한 짧은 작업"을 위해 설계되었으며 장기 실행 프로세스는 스레드 풀을 소모 할 수 있습니다.

Ftp 전송은 비교적 시간이 오래 걸리며 (합리적인 시간 초과에도 불구하고) 실제로 적합하지 않습니다. 스레드 풀을 사용하여 얻을 수 있지만, 사용하면 설명 할 수없는 버그가 있음을 알 수 있습니다. 응용 프로그램이 스레드 풀 종속 프레임 워크 기능 (비동기 대리자 등)을 사용하는 정도에 따라 다릅니다.

MSDN의 주제는 "The Managed Thread Pool는"는 스레드 풀 스레드를 사용하지 때 좋은 지침을 제공합니다

몇 가지 시나리오가 만들고 스레드를 사용하는 자신의 스레드를 대신 관리하는 것이 적절하다있는있다 풀 스레드 :

  • 포 그라운드 스레드가 필요합니다.
  • 스레드에 특정 우선 순위가 필요합니다.
  • 스레드가 오랜 시간 동안 차단되는 작업이 있습니다. 스레드 풀의 최대 스레드 수는 개이므로 많은 수의 차단 된 스레드 풀 스레드로 인해 작업이 시작되지 않을 수 있습니다.
  • 스레드를 단일 스레드 아파트에 배치해야합니다. 모두 ThreadPool 스레드는 다중 스레드 아파트에 있습니다.
  • 스레드와 연결된 안정적인 ID가 필요하거나 스레드를 작업 전용으로 지정해야합니다. 당신이 스레드에 대기 작업을 설정하는 대신 초기화 및 개별 스레드를 청소에 대한 걱정에 집중할 수로
+0

입력 해 주셔서 감사합니다. 내가 쓰레드를 만들고 직접 관리 할 것을 제안합니까? –

+0

사실, 스레드를 만들고 관리하는 것은 장기간에 걸쳐 진행하는 방법입니다. 스레드를 돌리는 데 드는 비용은 FTP 전송 시간에 비해 중요하지 않을 것이며, 이는 스레드 풀링의 주요 이점 중 하나를 부인합니다 (다른 하나는 단순화 된 인터페이스 'QueueUserWorkItem' 제공). –

1

스레드 풀 좋을 것이다.

하지만 어떻게 작동합니까? 호스트의 여러 풀을 대기열에 넣을 예정입니까? 아니면 자체 대기열에서 작업을 읽는 호스트마다 스레드를 갖출 예정입니까?

+0

대기열에 대한 단일 데이터베이스 테이블이 있으며 컴퓨터 이름별로 열이 있습니다. 클라이언트 서비스는 자신의 컴퓨터 이름으로 쿼리합니다. 그런 다음 해당 레코드의 하위 집합 (100 개의 레코드가 반환된다고 가정)에서 호스트별로 그룹화됩니다 (100 개의 레코드 집합에서 4 개의 고유 호스트가 반환되었다고 가정 해 봅시다). 그래서, 나는 각 호스트에 대해 시작된 4 개의 스레드를 풀에 갖고 싶습니다. –