2015-04-12 5 views
0

Я создаю приложение с блокировкой 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))) 

Благодарности

+0

Почему замедление работы делает вас уверенным, что он делает то, что он должен делать? Кроме того, карта ленивая, и вы хотите pmap? –

+0

Элемент запроса выполняется быстро, поэтому я не был полностью уверен, что он сначала напечатает «Обработка ...» и «Готово». Спасибо за предложение pmap, но я не могу сделать это параллельно. 'query-item' поражает сторонний HTTP-API, который разрешает всего несколько запросов в секунду. Немного пошутившись, я узнал, что если я (println) вместо (print) работает, как и ожидалось. Выходной буфер, вероятно, сбрасывается на новую строку? –

ответ

1

Appearently print Безразлично Автоматический сброс буфера на экран. Добавление (flush) после первого print исправляет его. println сбрасывает его сам.

Исходный код: println звонки prn функция, которая имеет (flush) как один из побочных эффектов prn

Смежные вопросы