단일 파일에 결과를 기록하기 위해 콜백과 함께 제공되는 수백 개의 동시 http-kit.client/get
요청을 시작합니다.동시 http-kit/get 인스턴스 내에서 i/o 콜백을 사용하는 가장 쉬운 방법
스레드 안전성을 처리하는 좋은 방법은 무엇입니까? chan
및 <!!
을 core.asyc
에서 사용 하시겠습니까? 당신의 통찰력에 대한
(defn launch-async [channel url]
(http/get url {:timeout 5000
:user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:10.0) Gecko/20100101 Firefox/10.0"}
(fn [{:keys [status headers body error]}]
(if error
(put! channel (json/generate-string {:url url :headers headers :status status}))
(put! channel (json/generate-string body))))))
(defn process-async [channel func]
(when-let [response (<!! channel)]
(func response)))
(defn http-gets-async [func urls]
(let [channel (chan)]
(doall (map #(launch-async channel %) urls))
(process-async channel func)))
감사 :
는 여기에 내가 고려할 것입니다 코드입니다.
큰 URL 시퀀스가 제공되면 'launch-asyc'이 오버플로 될 것으로 예상 했었습니다. 왜 그렇지 않은가? (그것이 공식적인 제안으로 주어 졌기 때문에 나는 그것을 추측한다). 감사합니다 – user3639782
또 다른 문제. 그것은 repl (boot repl)에 코드를 보내는 한 파일에 씁니다. 그러나 같은 코드를'-main' 함수 안에 넣고 스크립트로 실행할 때 아무 일도 일어나지 않습니다. 그런 식으로 행동해야합니까? 감사합니다. – user3639782
@ user3639782 'repeat'함수에 의해 생성 된 시퀀스에서 가져온 각 요소는 "주문형"으로 생성됩니다. 즉, 시퀀스가 게으르고 실제로 무한 할 수 있습니다. 그래서, url의 목록은 글자 그대로 메모리를 거의 사용하지 않습니다. 다른 질문에 대해서는 파일에 쓰는 것이 무슨 뜻인지 잘 모르겠습니다. – Josh