2013-06-21 2 views
3

다음과 같은 코드를 생각해 보내기 보내기/오프의 조합을 사용하여Clojure : 에이전트 호출 에이전트 : 교착 상태 의심?

(let 
    [slave-agent (agent 0) 
    run-slave (fn [_] (println "running slave agent")) 
    run-master (fn [_] 
      (loop [] 
       (println "sending to slave agent") 
       (send-off slave-agent run-slave) 
       (Thread/sleep 1000) 
       (recur) 
      ) 
      ) 
    master-agent (agent nil) 
    ] 
    (send-off master-agent run-master) 
) 

을, 나는 노예 에이전트가 실행이 없습니다. 그러나 run-master를 java.lang.Thread에서 실행하면 모든 것이 잘 동작합니다.

누구나 아이디어가 있습니다.

는 작업 (또는 거래) completted (헌신적)까지 개최되는 에이전트 작업 (또는 거래)에서 당신

감사

J-C

답변

2

send 감사드립니다. 그러나 주인은 결코 돌아 오지 않습니다. 따라서 실제 실행을 위해 제출되지 않은 요청은 send-off 만 누적됩니다. 다음과 같이 시도하십시오.

(defn run-master 
    [_] 
    (send-off slave-agent run-slave) 
    (send-off *agent* run-master) 
    (Thread/sleep 1000)) 
+0

무슨 뜻인지 이해가되지 않습니다. 보내기에 사용되는 작업자 풀은 제한되지 않습니다. 그래서 질문의 예제 코드는 잘 작동 할 것입니다. 하나의 쓰레드 (run-master 액션 실행)만이'send-off' thread-pool의 쓰레드를 보유 할 것이기 때문입니다. 'send-off' 함수를 사용할 때마다 우리는 액션 실행이 차단 될 수 있고 올바르지 않거나 예기치 않은 행동이 아님을 안다. – hsestupin

+0

코타 락의 설명이 정확하다는 것을 이해합니다. 문서를 읽은 후, 나는 단순히 send/send-off의 예상되는 동작을 이해하지 못했습니다. 도움 주셔서 감사합니다. – jcmincke

+0

@hsestupin 요점은 'send'가 상담원 작업에서 즉시 발생하지 않는다는 점입니다. 작업이 완료 될 때까지 지연됩니다. 그 일은 결코 일어나지 않을 것입니다. – kotarak