我可以在clojure.core.async / go中对期货/承诺进行deref吗?

时间:2017-11-09 23:27:23

标签: multithreading asynchronous concurrency clojure core.async

我试图找到一种无害地观察许多future的方法。通过这个,我的意思是不阻止N个线程等待N future s。

我看到core.async库的构建方式不会阻塞带有阻塞操作的线程,而是将其停放并重用该线程。是deref的情况,还是仅适用于<!alts!

1 个答案:

答案 0 :(得分:2)

future-done?函数可用于轮询期货数组,以查看哪些期货可供查看:

main> (future-done? (future 42))
true
main> (future-done? (future (Thread/sleep 1000) 42))
false

然后你可以创建一个函数来轮询所有未来(在一个向量中),然后继续工作。通过这种方式而不是阻止每个未来的线程,你阻止任何未来的线程,并决定你想要多少这样的工人(一次一个是常见的选择)

如果您希望它比这更高效或更具表现力,那么您将创建一个状态机来跟踪要检查和处理哪些期货,这将使您重新创建自己的版本{{1}并且可能会更好地一直使用core.async。