如何在运行时修改函数然后传播到多个线程?

时间:2012-06-28 00:24:01

标签: function concurrency clojure

使用Clojure(以及其他Lisp方言),您可以修改正在运行的代码。那么,在运行期间修改函数时,该更改是否可用于多个线程?

我试图弄清楚它在并发设置中的工作原理:如果有几个线程正在使用函数 foo ,那么当我重新定义时会发生什么(例如使用 defn )函数 foo

必须进行一些同步:何时以及如何进行这种同步以及它的成本是多少?

在JVM上说,是使用volatile引用引用的函数吗?如果是这样,是否意味着每次都有“功能查询”,那么必须支付volatile费用?

1 个答案:

答案 0 :(得分:8)

在Clojure中,函数是IFn类和are almost always stored in vars的实例。变量是线程局部值的Clojures机制。

  • 定义一个设置var的“根绑定”的函数以引用函数
  • 线程其他线程获取var的根绑定的当前值,但不能更改该值。这可以防止任何两个线程必须争夺var的值,因为只有根线程可以设置值。
  • 线程可以选择在需要时使用var的新值,但调用binding然后给出自己的线程本地值,它们可以随意更改,因为没有其他线程可以读取它。

对vars的一个很好的理解值得一点研究,一旦你习惯了它们,它们是一个非常有用的并发设备。

ps:根线程通常是REPL pss:你当然可以自由地将你的函数存储在vars以外的东西中,例如你需要自动更新一组函数,尽管这种情况很少见。