The source는 정보입니다 :
여기
(dotimes [_ n]
(case type
:blocking (thread
(let [job (<!! jobs)]
(when (process job)
(recur))))
:compute (go-loop []
(let [job (<! jobs)]
(when (process job)
(recur))))
:async (go-loop []
(let [job (<! jobs)]
(when (async job)
(recur))))))
n
가 제공하는 병렬 인수입니다; (블로킹 모드에서) 또는 go-loop
(컴퓨팅 또는 비동기 모드에서)의 수를 제어합니다.
"양호한 기본값"을 구성하는 것은로드 프로필, 하드웨어 리소스, &에 따라 다릅니다. c - 네트워크 액세스로 인해 작업이 차단되는 경우 CPU가있는 것보다 더 많은 작업이있을 수 있으며 차단되는 경우 CPU를 사용할 수 있기를 기대하는 코어보다 많은 스레드는 낭비입니다. 병목 현상이 로컬 디스크 I/O 인 경우이 질문의 범위를 훨씬 뛰어 넘는 많은 세부 사항 (플래터 또는 NVRAM 회전 - 다른 프로세스의 액세스 요구 사항이 플래터를 통해 분산되어 있습니까?)이 관련성이 있습니다.
일반적으로 스레드 풀 사이징에 일반적으로 적용 할 판단, 경험 및 튜닝/측정 기술을 사용하십시오.
여기서 이해하지 못하는 중요한 부분 중 하나는 내 이해가 정확하다면 그 중 하나가 다른 것과 다르다는 것입니다. '파이프 라인'과 '파이프 라인 차단'에서 병렬 처리는 실제로 말하는 사람의 수를 제어하며 이러한 모든 고려 사항이 적용됩니다. 그러나'pipeline-async'에서 얼마나 많은 노동자가 어떤 종류의 노동자인지는이 매개 변수에 의해 결정되지 않습니다. 대신 비동기 작업 디스패처의 수를 제어합니다. 그 수는 중요하지 않습니다. 그래서'pipeline-async'는 1이나 2가 아닌'n '으로 넘겨 줄 이유가 없습니다. – glts
'pipeline-async'에서 주어진 함수가 즉시 반환 될 것이지만, 나중에 전달 된 채널에 결과가 전달되고 (해당 채널을 닫음) 결과가 좋습니다. –
Charles가 말한 것에 덧붙이 기 위해 파이프 라인에 비동기 DB에 60 개의 연결을 풀기 위해'pipeline-async'를 사용했습니다. –