The Agent class was inspired by agents in Clojure.
The Agent class was inspired by agents in Clojure.
Agents provide asynchronous change of individual locations. Agents
are bound to a single storage location for their lifetime, and only
allow mutation of that location (to a new state) to occur as a result
of an action. Update actions are functions that are asynchronously
applied to the Agent's state and whose return value becomes the
Agent's new state. The state of an Agent should be immutable.
While updates to Agents are asynchronous, the state of an Agent is
always immediately available for reading by any thread (using get
or apply) without any messages.
Agents are reactive. The update actions of all Agents get interleaved
amongst threads in a thread pool. At any point in time, at most one
send action for each Agent is being executed. Actions dispatched to
an agent from another thread will occur in the order they were sent,
potentially interleaved with actions dispatched to the same agent from
other sources.
Example of usage:
val agent = Agent(5)
agent send (_ * 2)
...
val result = agent()
// use result ...
Agent is also monadic, which means that you can compose operations using
for-comprehensions. In monadic usage the original agents are not touched
but new agents are created. So the old values (agents) are still available
as-is. They are so-called 'persistent'.
Example of monadic usage:
val agent1 = Agent(3)
val agent2 = Agent(5)
for (value <- agent1) {
result = value + 1
}
val agent3 = for (value <- agent1) yield value + 1val agent4 = for {
value1 <- agent1
value2 <- agent2
} yield value1 + value2
DEPRECATED STM SUPPORT
Agents participating in enclosing STM transaction is a deprecated feature in 2.3.
If an Agent is used within an enclosing transaction, then it will
participate in that transaction. Agents are integrated with the STM -
any dispatches made in a transaction are held until that transaction
commits, and are discarded if it is retried or aborted.
Annotations
@deprecated
Deprecated
(Since version 2.5.0) Agents are deprecated and scheduled for removal in the next major version, use Actors instead.
The Agent class was inspired by agents in Clojure.
Agents provide asynchronous change of individual locations. Agents are bound to a single storage location for their lifetime, and only allow mutation of that location (to a new state) to occur as a result of an action. Update actions are functions that are asynchronously applied to the Agent's state and whose return value becomes the Agent's new state. The state of an Agent should be immutable.
While updates to Agents are asynchronous, the state of an Agent is always immediately available for reading by any thread (using get or apply) without any messages.
Agents are reactive. The update actions of all Agents get interleaved amongst threads in a thread pool. At any point in time, at most one send action for each Agent is being executed. Actions dispatched to an agent from another thread will occur in the order they were sent, potentially interleaved with actions dispatched to the same agent from other sources.
Example of usage:
Agent is also monadic, which means that you can compose operations using for-comprehensions. In monadic usage the original agents are not touched but new agents are created. So the old values (agents) are still available as-is. They are so-called 'persistent'.
Example of monadic usage:
DEPRECATED STM SUPPORT
Agents participating in enclosing STM transaction is a deprecated feature in 2.3.
If an Agent is used within an enclosing transaction, then it will participate in that transaction. Agents are integrated with the STM - any dispatches made in a transaction are held until that transaction commits, and are discarded if it is retried or aborted.
(Since version 2.5.0) Agents are deprecated and scheduled for removal in the next major version, use Actors instead.