我想通过 clojure 中的 claypoole 库将要评估的表单作为未来传递给目标线程池。
我尝试将函数主体传递给线程池,并且我希望该函数主体在线程上而不是内联上进行评估。
我的代码如下所示:
(defn in-thread [thread & body] (claypoole/future thread body))
它的调用方式如下:
(defonce pool (claypoole/threadpool 20))
(defn do-something [pool]
(in-thread pool
(Thread/sleep 5000)
(println "foo")))
经过一些测试,我得出的结论是,body
当我调用时,正在评估in-thread
,这使得我的整个解决方案实际上没有做任何有意义的事情。我知道我缺少某种基本概念,但每次我尝试研究宏时,我的头就开始旋转。
我如何将in-thread
函数变成一个宏,将函数主体而不是结果传递到线程池中执行?
当您使用函数(即使用
defn
/创建的构造fn
)时,将在调用函数本身之前评估其所有参数。因此,在您的例子中,函数in-thread
被调用,结果为和(Thread/sleep ...)
,(println ...)
并且两者都是nil
。为了传递表单而不实际评估它们,您要么引用这些表单并
eval
稍后使用,要么使用宏,这是一种更常见的方法。就您而言,只需用以下内容替换定义即可
in-thread
:但是,请注意,它只是一个包装器
claypoole/future
,本身不执行任何操作。它claypoole/future
本身已经是一个宏- 你甚至不需要in-thread
!你所需要的一切都已由实现claypoole/future
,因此你可以使用它: