© DMM
© DMM
なんとなく理解するActor
Actorと仲良くしよう
野瀬田 裕樹(@ynoseda)
2024/1/29
© DMM
野瀬田 裕樹(@ynoseda)
2023年9月 合同会社DMM.com 中途入社
開発統括本部 アプリ開発室
自己紹介
2
© DMM
3
みなさん、Actor理解してますか?
© DMM
4
私は全然理解できてません(とりあえずMainActorあるある)
© DMM
5
ということで
© DMM
6
今日は私と一緒になんとなくでも理解できるようになりましょう
© DMM
Actorとは
SwiftにおけるActorについてはSwift.orgに記載がある
https://docs.swift.org/swift-book/documentation/the-swift-programmi
ng-language/concurrency/#Actors
7
© DMM
Actorとは
You can use tasks to break up your program into isolated, concurrent
pieces. Tasks are isolated from each other, which is what makes it
safe for them to run at the same time, but sometimes you need to
share some information between tasks. Actors let you safely share
information between concurrent code. Like classes, actors are
reference types, so the comparison of value types and reference
types in Classes Are Reference Types applies to actors as well as
classes. Unlike classes, actors allow only one task to access their
mutable state at a time, which makes it safe for code in multiple tasks
to interact with the same instance of an actor.
8
© DMM
9
読む気にならないですね
© DMM
10
Google翻訳しましょう
© DMM
1. タスクについての記載
● タスクを使うとプログラムを独立していて同時に実行できるパーツに分
割できる
● タスクは分離されていて安全に同時実行できるが、場合によってはタス
ク間で情報を共有する必要がある
Actorとは
11
© DMM
2. Actorについての記載
● アクターを使用すると、安全にタスク間で情報を共有できる
● アクターはクラスと同様に参照型である
● アクターはクラスとは異なり、一度に 1 つのタスクのみが可変状態にア
クセスできる
Actorとは
12
© DMM
13
字面ではわかるがわからん
© DMM
14
そういう時はActorという単語の意味を調べましょう
© DMM
https://www.merriam-webster.com/dictionary/actor
1 : one that acts : DOER
2
a : one who acts in a play, movie, television show, etc.
b : one who behaves as if acting a part
3 : one that takes part in any affair : PARTICIPANT
Actorという単語の意味
15
© DMM
https://www.merriam-webster.com/dictionary/actor
1 : one that acts : DOER
2
a : one who acts in a play, movie, television show, etc.
b : one who behaves as if acting a part
3 : one that takes part in any affair : PARTICIPANT
要するになんらかの行動をするもの、役に従って振る舞うものを表す
Actorという単語の意味
16
© DMM
17
じゃあなぜタスク間で安全に情報を共有できる参照型がActorなのか?
© DMM
A universal modular ACTOR formalism for artificial intelligence
https://www.ijcai.org/Proceedings/73/Papers/027B.pdf
というpaperが初出らしい
プログラミングにおけるActorの初出は?
18
© DMM
このpaperの概要の次に記載されている一文がActorの重要な概念
> Programs should not only work, but they should appear to work as
well.
プログラミングにおけるActorの初出は?
19
© DMM
このpaperの中にActorについての概要が記載されている
> この作業の過程で、私たちは ACTOR という 1 つの基本概念を中心に形
式主義を統一することに成功しました。 直観的には、ACTOR は、スクリプト
に従ってキューの役割を果たすアクティブなエージェントです。モデルにお
ける制御とデータ フローの不可分性を強調するために、ACTOR の比喩を
使用します。
プログラミングにおけるActorの初出は?
20
© DMM
● スクリプトに従ってキューの役割を果たすアクティブなエージェントのこ
と
● どのタイミング・条件でどういった振る舞いをするべきか、つまり制御と
データフローはセットで考えるべきで、それらがセットになったものを
Actorという比喩で表現している
元々のActorとは
21
© DMM
このpaperの中にActorについての性質も記載されている
> 私たちの形式主義は、すべての動作モードが 1 種類の動作、つまり
ACTORにメッセージを送信するという観点からどのように定義できるかを示
しています。 ACTORは、再帰関数、データ構造、またはプロセスとして動作
するかどうかに関係なく、常にまったく同じ方法で均一に呼び出されます。
(中略)すべてのACTORには、メッセージが送信されるACTORの前提条件
とコンテキストが満たされていることを確認する INTENTION があります。
INTENTIONとは、ACTORが外の世界と結ぶ契約です。ACTORが契約をど
のように履行するかは、ACTOR自身の仕事です。
Actorの性質
22
© DMM
Actorの性質
23
全てがActor 統一された呼出 Intension
© DMM
● 全てがActorで表現できる
○ Monotheism is the answer
○ データ構造、関数、セマフォなど多岐にわたる概念を包括している
● 統一された呼び出し方法
○ Actorは内部でどのように振る舞っていたとしても、同じ方法で一貫して呼び出し
される
● Intention(意図)
○ 外の世界とActorの間には契約があり、その契約に従ってActorは振る舞う
元々のActorとは
24
© DMM
https://github.com/apple/swift-evolution/blob/main/proposals/0306-act
ors.md
SE-0306で背景や詳細が確認できる
SwiftにおけるActor
25
© DMM
● 従来のclassにおける課題感
○ データ競合回避が難しい
○ データ競合のような並行処理における不具合を静的に検出できない
SwiftにおけるActor導入の背景
26
© DMM
27
いい感じにデータ競合を回避する方法は何かないか?
© DMM
28
例えばデータのフローと制御をセットで扱って、
データ競合がおきないように
いい感じの条件、タイミングで状態を扱ってくれるような
© DMM
29
あっ、これ
A universal modular ACTOR formalism for artificial intelligence
でやったところだ!
© DMM
● プログラムは単に機能するだけではだめ
● ちゃんと外から見たときに利用側の期待通りに振る舞ってくれるということ
が大切
● Actorはこちらの期待した役をきちんと演じてくれる役者さん
● データ競合がおきないように状態を扱って欲しいなぁの期待に応えてくれ
るのがActor
Actorに対するイメージ
30
© DMM
SwiftにおけるActor
31
© DMM
SwiftにおけるActor
32
© DMM
SwiftにおけるActor
33
© DMM
SwiftにおけるActor
34
© DMM
● Actorはその性質から、警告が出ないようにちゃんと実装すれば基本的
にはデータ競合を防ぐことができるはず
● コンパイラを頼りにActorの使い方を勉強しよう
● Build SettingsのSWIFT_STRICT_CONCURRENCYをcompleteにする
と、モジュール全体にわたってSendableの制約とactor isolationのチェッ
クを強制してくれる
SwiftにおけるActor
35
© DMM
● 送信可能って日本語訳わかりにくいよね
● コピーすることで、ある非同期処理のドメインから別のドメインに渡せるも
の
● 単純な値型で構成されているstructとか、そういうコピーした後に書き込
みしても前のデータに影響しないものが該当する
● Sendableなデータはactor同士のやり取りで使える
Sendableって何?
36
© DMM
発生する警告の例
37
© DMM
発生する警告の例(actor-isolationチェック)
38
© DMM
発生する警告の例(actor-isolationチェック)
39
© DMM
発生する警告の例(actor-isolationチェック)
40
© DMM
発生する警告の例(Sendable制約)
41
© DMM
発生する警告の例(Sendable制約)
42
© DMM
発生する警告の例(キャプチャでも起きるよ)
43
© DMM
発生する警告の例(キャプチャでも起きるよ)
44
© DMM
● Actorと一口にいっても、単なるactorもあればMainActorのように特殊な
Actorもある
● DistributedActor
● GlobalActor
● MainActor
● AnyActor
色んなActor
45
© DMM
● 一番良く使うMainActorくらいは定義を見ておこう
MainActor
46
© DMM
MainActor
47
© DMM
actorはインスタンスが違うと違うactorだよ
48
© DMM
GlobalActor
49
© DMM
● Actorは結構古くからある概念で、元の論文を読むとイメージが掴めるか
も
● Actorというだけで静的にデータ競合を回避できるなんて凄いよね
● コンパイラのサポートを使って上手にデータ競合を回避しよう
まとめ
50
© DMM
ご静聴ありがとうございました
© DMM
Audience Q&A Session
ⓘ
Click Present with Slido or install our Chrome extension to show live Q&A
while presenting.

なんとなく理解するActor 〜Actorと仲良くしよう〜 @DMM.swift #1