Interface
Most of the following needs yet work .
Actors provides a versatile interface to work with other actor libraries in the JuliaActors ecosystem or to allow programmers and users alike to extend its functionality:
- It is written against
ActorInterfaces.Classic. Thus it can execute programs written with the primitives in that interface. - Actors from other libraries written with that interface have actor level compatibility. Thus they can exchange messages, use the Actors registry (and upcoming supervision).
- Other libraries written against that interface can plugin the
Actors'onmessageprotocol and thus inherit the user API functions:call,cast... - Other party libraries can start actors in another mode and implement a different
onmessageprotocol to make their actors do different things. - Users can enhance the implemented
Msgtypes and extend theonmessagemethods for working with those messages.
Reimplementing Actor Primitives
On JuliaActors there is a companion library SlowActors to illustrate one use of the interface. This is a completely different implementation of the Actor Model. It doesn't use Julia Channels for message passing and operates without an actor loop. Rather each time a message to a "slow" actor is sent, an actor Task is started.
But in using the common Link type, actors from both libraries can communicate. With actually few lines of code SlowActors plugs in the Actors interface and is able to run the identical examples. It actually only reimplements three primitives: spawn, newLink and send!.
Change Actor Mode and Behavior
Actors provides a mode field in both Link and _ACT, with mode=:default for normal operation.
Other libraries can spawn their actors with a different mode, e.g. mode=:GenServer. If they then enhance onmessage with e.g.
Actors.onmessage(A::_ACT, ::Val{:GenServer}, msg::Call) = ...
Actors.onmessage(A::_ACT, ::Val{:GenServer}, msg::Cast) = ...
....... they get for those messages a different actor behavior where they can do callbacks or set state or whatever they want to. Actors spawned with a different mode return a link with the mode field set accordingly.
Currently there are two libraries capitalizing on this functionality:
| library | brief description |
|---|---|
| Guards | Actors guarding access to mutable variables. |
| GenServers | Actors representing generic servers and allowing users to write sequential code to use them. |