【问题标题】:Can I deref futures/promises in clojure.core.async/go?我可以在 clojure.core.async/go 中取消期货/承诺吗?
【发布时间】:2017-11-09 23:27:23
【问题描述】:

我试图找到一种方法来无害地观察许多futures。我的意思是不阻塞 N 个线程来等待 N 个 futures。

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

【问题讨论】:

  • 您的标题听起来像是在询问如何在 go 块中执行此操作,而您的问题听起来像是在询问如何使用期货而不是在 go 块中执行此操作。你在找哪个?
  • @ArthurUlfeldt 我正在寻找一种不会导致 thread 被等待 deref 阻塞的方法。
  • 你必须使用clojure的期货吗?在现实世界的使用中,我会不惜一切代价避免它们。使用其他方式,例如ztellman/manifold library。
  • @Clojure 大多数期货可以用future-cancel 停止,这使它们与其他解决方案区分开来。

标签: multithreading asynchronous concurrency clojure core.async


【解决方案1】:

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

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

然后您可以创建一个函数来轮询所有期货(也许在一个向量中)以供其处理,然后继续执行该工作。这种方式不是在 each 未来阻塞一个线程,而是在 any 未来阻塞一个线程并决定你想要多少这样的工人(一次一个是常见的选择)

如果您希望它比这更高效或更具表现力,您将创建一个状态机来跟踪要检查和处理哪些未来,这将使您走上重新创建自己的版本clojure.core.async/alts! 和一直使用 core.async 可能会更好。

【讨论】:

  • 因此,最好的方法可能是使用单独的线程来不断检查您拥有的所有期货是否已完成?虽然它有效,但它在某种程度上看起来并不是一个干净的解决方案。
  • 在问题中添加了对此的答案
猜你喜欢
  • 2012-09-19
  • 2015-07-25
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2017-05-07
  • 2016-08-14
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多