2014-09-24 1 views
0

일주일 전 비슷한 질문 (Link)을 사용하여지도의 게으른 특성으로 인해 다음 코드가 순차적으로 실행된다는 것을 알게되었습니다.선물과 게으름 순서 간의 상호 작용 이해

(defn future-range 
    [coll-size num-futures f] 
    (let [step (/ coll-size num-futures) 
     parts (partition step (range coll-size)) 
     futures (map #(future (f %)) parts)]  ;Yeah I tried doall around here... 
    (mapcat deref futures))) 

의미가 있습니다. 하지만 어떻게 고칠 수 있습니까? 나는 거의 모든 것을 둘러 보았습니다. (: D), 약속과 다른 많은 다른 접근법. 그것은 단지 일하고 싶지 않습니다. 왜? 미래는 맵캣이 역설적이 될 때까지 시작하지 않는다. (Thread/sleep로 몇 가지 테스트를했다.) 그러나 doall로 시퀀스를 완전히 인식하면 미래가 다른 스레드에서 즉시 시작되어서는 안됩니까?

답변

2

이미 존재하는 것 같습니다. (map #(future (f %)) parts)(doall ...)에 넣으면 작동합니다. repl을 다시 시작하고 깨끗한 슬레이트에서 시작하여 올바른 버전의 함수를 호출하고 있는지 확인하십시오.

(defn future-range 
    [coll-size num-futures f] 
    (let [step (/ coll-size num-futures) 
     parts (partition step (range coll-size)) 
     futures (doall (map #(future (f %)) parts))] 
    (mapcat deref futures))) 

다음을 사용하여 테스트 할 수 있습니다.

(defn test-fn [x] 
    (let [start-time (System/currentTimeMillis)] 
    (Thread/sleep 300) 
    [{:result x 
     :start start-time 
     :end-time (System/currentTimeMillis)}])) 

(future-range 10 5 test-fn) 
또한 단지 유일한 시간 300 밀리 초 소요 5 회 (Thread/sleep 300)을하는 것을 측정하는 time을 사용할 수

:

(time (future-range 10 5 (fn [_] (Thread/sleep 300)))) 
관련 문제