我试图找到一种无害地观察许多future
的方法。通过这个,我的意思是不阻止N个线程等待N future
s。
我看到core.async
库的构建方式不会阻塞带有阻塞操作的线程,而是将其停放并重用该线程。是deref的情况,还是仅适用于<!
和alts!
?
答案 0 :(得分:2)
future-done?
函数可用于轮询期货数组,以查看哪些期货可供查看:
main> (future-done? (future 42))
true
main> (future-done? (future (Thread/sleep 1000) 42))
false
然后你可以创建一个函数来轮询所有未来(在一个向量中),然后继续工作。通过这种方式而不是阻止每个未来的线程,你阻止任何未来的线程,并决定你想要多少这样的工人(一次一个是常见的选择)
如果您希望它比这更高效或更具表现力,那么您将创建一个状态机来跟踪要检查和处理哪些期货,这将使您重新创建自己的版本{{1}并且可能会更好地一直使用core.async。