我正在啓動幾百個併發的http-kit.client/get
請求,並提供回調以將結果寫入單個文件。在併發http-kit/get實例中使用I/O回調的最簡單方法
什麼是處理線程安全的好辦法?從core.asyc
使用chan
和<!!
?
下面的代碼,我會考慮:
(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)))
感謝您的見解。
我希望'launch-asyc'溢出時提供一個大的url序列。爲什麼不是這樣? (我認爲這是因爲它是作爲官方建議提供的)。感謝 – user3639782
另一件事。只要我將代碼發送到repl(boot repl),它就會寫入文件,但是當我將相同的代碼包裝在'-main'函數中並將其作爲腳本運行時,沒有任何反應。它應該這樣表現嗎?感謝 – user3639782
@ user3639782從「repeat」函數產生的序列中取出的每個元素是「按需」產生的,即序列是懶惰的,實際上可以是無限的。所以,網址列表幾乎沒有記憶。關於您的其他問題,我不確定您寫入文件的意思。 – Josh