Я создаю приложение с блокировкой HTTP-вызовов. Я хотел бы напечатать что-то перед блоком, а затем продолжить что-то после завершения блокирующего вызова. Мой первый был учил сделать это как этотКогда возникают побочные эффекты?
(print "Processing " item-hash "...")
(query-item item-hash)
(Thread/sleep 10000)
(println "Done")))
сна есть только замедлить его даже больше, чтобы быть 100% уверены, что он делает то, что он должен.
В моем понимании, оно должно напечатать сообщение, запустите query-item
, затем спящий на 10 секунд и распечатайте Done
после этого. Но в данный момент он ждет, пока весь родительский sexpr не будет сделан и печатает после этого (выводит всю строку, когда все блокирующие вызовы сделаны.
Все основным для справки
(defn -main [& echo]
(map
(fn [url]
(let [item-hash (market-listing-url-to-hash-name url)]
(print "Processing " item-hash "...")
(query-item item-hash)
(Thread/sleep 10000)
(println "Done")))
(collect-urls 1)))
Благодарности
Почему замедление работы делает вас уверенным, что он делает то, что он должен делать? Кроме того, карта ленивая, и вы хотите pmap? –
Элемент запроса выполняется быстро, поэтому я не был полностью уверен, что он сначала напечатает «Обработка ...» и «Готово». Спасибо за предложение pmap, но я не могу сделать это параллельно. 'query-item' поражает сторонний HTTP-API, который разрешает всего несколько запросов в секунду. Немного пошутившись, я узнал, что если я (println) вместо (print) работает, как и ожидалось. Выходной буфер, вероятно, сбрасывается на новую строку? –