Clojure - 代理

正如多次指出的那样,Clojure 是一种编程语言,其中许多数据类型都是不可变的,这意味着更改变量值的唯一方法是创建一个新变量并将新值分配给它 。 然而,Clojure 确实提供了一些可以创建可变状态的元素。 我们已经看到这可以通过原子数据类型来实现。 实现这一目标的另一种方法是通过代理。

代理提供各个位置的独立、异步更改。 代理在其生命周期内绑定到单个存储位置,并且只允许该位置因操作而发生突变(到新状态)。 操作是异步应用于代理状态的函数(带有可选的附加参数),其返回值成为代理的新状态。

在 Clojure 中可以对代理进行以下操作。

序号 操作及说明
1 agent

使用agent命令创建代理。

2 send

此函数用于向代理发送值。

3 shutdown-agents

此函数用于关闭任何正在运行的代理。

4 send-off

在某些情况下,代理被分配了本质上是阻塞的功能。

5 await-for

由于更新代理值时存在延迟,Clojure 提供了"await-for"函数,用于指定等待代理更新的时间(以毫秒为单位)。

6 await

阻塞当前线程(无限期!),直到迄今为止从该线程或代理分派到代理的所有操作都已发生。 将阻止失败的代理。

7 agent-error

如果代理失败,则返回代理异步操作期间引发的异常。 如果代理没有失败,则返回 nil。