我想在Clojure中创建一些 future ,并在特定线程上全部运行它们,以确保它们一次运行。这可能吗?
包装Java库来完成此操作并不难,但是在执行此操作之前,我想确保自己没有错过Clojure的执行方法。在Java中,我可以通过实现FutureTask
并将这些任务提交给单线程执行器来实现。
最佳答案
Clojure的future macro调用使用future-call的a dedicated executor service函数。这意味着您无权强制执行顺序执行。
另一方面,您可以使用promise代替future
对象,并可以使用一个future
线程按顺序deliver结果。 Promise的API与future
提供的API类似。他们也有deref和realized?。
以下代码示例使子任务在后台的新线程上顺序执行,而函数的立即返回结果包含对计算值的 promise 。
(defn start-async-calc []
(let [f1 (promise)
f2 (promise)
f3 (promise)]
(future
(deliver f1 (task-1))
(deliver f2 (task-2))
(deliver f3 (task-3)))
{:task1 f1
:task2 f2
:task3 f3}))
关于multithreading - 如何在单个线程中执行一些Clojure future ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998199/