2017-10-29

アクター

メッセージパッシングとも言う。

Sagittariusには(util concurrent)があるのだが、今までこのスタイルのライブラリを追加してなかった。理由としては
  • 実装自体はトリビアルであること
  • ライブラリにするにはアイデアの練りが足りないこと
の二つが主であった。のだが、あまりにも似たようなパターンを書くので重い腰を上げることにした。以下のように使う。
(import (rnrs) (util concurrent))

(define actor
  (make-shared-queue-channel-actor
    (lambda (input-receiver output-sender)
      (let loop ()
        (let ((in (input-receiver)))
          ;; do whatever with the input
          (output-sender (result)) ;; if output should be sent
          (loop))))))

(actor-send-message! actor 'message) ;; send a message to the actor
(actor-receive-message! actor)
わざわざチャンネルに使われているキュー名が入っているのは以下の理由から
  • shared-priority-queueバージョンのアクターもある
  • 入力と出力にどんなキューが使われるのか分からないので、make-actorみたいなのにはできない
二つ目の理由からmake-actor手続きは入力と出力を作る手続きを受け取るようになっている。

これをアクターと呼んでいいのかは正直よくわからないが、広義ではアクターモデルだろうということで。

No comments:

Post a Comment