2017-05-20 14 views
1

core.async에는 pipelines의 세 가지 종류가 있습니다. pipeline, pipeline-blockingpipeline-async입니다. 이 함수의 첫 번째 인수는 파이프 라인의 '병렬 처리'인 n입니다.core.async 파이프 라인의 병렬 처리 인수의 의미와 목적은 무엇입니까?

이 인수의 의미는 무엇입니까?

각 파이프 라인 유형에 어떤 영향을 미칩니 까? 병렬성에 적합한 기본 값은 무엇입니까? 언제, 왜 그 값을 늘리거나 줄일 것입니까? 실행중인 프로그램에 이러한 파이프 라인이 여러 개 있으면 어떻게 될까요?

답변

1

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 회전 - 다른 프로세스의 액세스 요구 사항이 플래터를 통해 분산되어 있습니까?)이 관련성이 있습니다.

일반적으로 스레드 풀 사이징에 일반적으로 적용 할 판단, 경험 및 튜닝/측정 기술을 사용하십시오.

+0

여기서 이해하지 못하는 중요한 부분 중 하나는 내 이해가 정확하다면 그 중 하나가 다른 것과 다르다는 것입니다. '파이프 라인'과 '파이프 라인 차단'에서 병렬 처리는 실제로 말하는 사람의 수를 제어하며 이러한 모든 고려 사항이 적용됩니다. 그러나'pipeline-async'에서 얼마나 많은 노동자가 어떤 종류의 노동자인지는이 매개 변수에 의해 결정되지 않습니다. 대신 비동기 작업 디스패처의 수를 제어합니다. 그 수는 중요하지 않습니다. 그래서'pipeline-async'는 1이나 2가 아닌'n '으로 넘겨 줄 이유가 없습니다. – glts

+1

'pipeline-async'에서 주어진 함수가 즉시 반환 될 것이지만, 나중에 전달 된 채널에 결과가 전달되고 (해당 채널을 닫음) 결과가 좋습니다. –

+0

Charles가 말한 것에 덧붙이 기 위해 파이프 라인에 비동기 DB에 60 개의 연결을 풀기 위해'pipeline-async'를 사용했습니다. –