[swift-evolution] [Concurrency] Actors + Behaviors + Signals

Marc Schlichte marc.schlichte at googlemail.com
Wed Sep 20 06:41:53 CDT 2017


Hi,

to anyone interested, I put some experimental Actor demo here:

https://github.com/frameworklabs/actress

The motivation of it is to have some setup to be able to play with async
actor methods for further discussions. As we don't have async/await right
now, I use Continuation Passing Style instead. I think this demo helps to
understand the difference between the actors dispatch queue and its
message/activity queue.

Also, I added `Behaviour` support to it, as I think this is a necessary
part unless we introduce a `wait-for-any-message-in()` method which can be
placed anywhere inside an actor-method.

Obviously, topics like securely passing arguments, master-worker setup,
actor lookup, remote capabilities etc. are not touched here.

Cheers
Marc

On Sun, Aug 20, 2017 at 9:43 PM, Marc Schlichte via swift-evolution <
swift-evolution at swift.org> wrote:

> Hi,
>
> here are some high-level thoughts on extending Actors with Behaviors and
> Signals.
>
> Actors + Behaviors:
>
> The set of messages an Actor might handle at a time is defined by the
> current behavior which can be changed with the `become` instruction:
>
> ```
> behavior B1 {
>   message m1()
>   message m2() -> Int
> }
>
> behavior B2 {
>   message m3(str: String)
> }
>
> actor A1: B1, B2 {
>   init() {
>     become B1
>   }
>   message m1() {
>     print(„m1“)
>     become B2
>   }
>   message m2() -> Int {
>     print(„m2“)
>     return 1
>   }
>   message m3(str: String) {
>     print(„m3\(str)“)
>     become B1
>   }
> }
> ```
>
> `behavior` is a kind of `protocol` which contains only actor functions.
>
> BTW, to allow for some bikeshed discussions here - I propose to use
> `message` instead of `actor func` - like preferring `actor`  to `actor
> class`.
>
> Behaviors are optional - if you don’t define/adopt behaviors, all messages
> in an actor are part of an implicit behavior.
>
> If a message arrives, which is not part of the current behavior, it will
> stay in the message queue but ignored until a supporting behavior becomes
> current again.
>
> To allow the reception of another message while a message handler is
> currently suspended in some async call - maybe communicating with another
> actor - an `interleaved` modifier for messages might be introduced. These
> interleaved messages are not allowed to change the current behavior though.
>
> Actors + Signals:
>
> Like classes, which often provide reactive APIs (via `delegates`, `KVO`,
> `NotificationCenter`, `Observables`, …) for unsolicited events, Actors will
> need a way to send messages to unknown other Actors.
>
> I thus propose the introduction of Signals:
>
> ```
> actor A2 {
>   signal s1(val: Int)
>
>   message m1(val: Int) {
>     print(„m1“)
>     s1(val)
>   }
> }
>
> actor A3 {
>   message m1(val: Int) { … }
>   message m2(str: String) { … }
> }
>
> let a2 = A2()
> let a3 = A3()
> a2.s1.connect(to: a3.m1)
> ```
>
> Signals might also support stream functions like `map`, `filter`,
> `throttle`, `distinctUntilChanged`, etc, to allow for reactive value
> transformations of signals sent by actors:
>
> ```
> a2.s1.throttle(interval: 0.2).map { String($0) }.connect(to: a3.m2)
> ```
>
> Cheers
> Marc
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170920/5e0747fb/attachment.html>


More information about the swift-evolution mailing list