2015-04-12 59 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

查询项目现在速度很快,所以我不完全确定它是否先打印出“Processing ...”,然后再打印出“完成”。感谢您提供pmap,但我无法并行执行。 'query-item'正在打第三方HTTP API,每秒只允许几个请求。经过一番周折后,我发现如果我(println)而不是(print),它会按预期工作。输出缓冲区可能会在换行符上刷新? –

回答

1

Appearently print没有按不会自动将缓冲区刷新到屏幕上,在第一个print修复后添加(flush)println刷新它本身

源代码: println调用prn(flush)作为副作用之一的函数prn