【Erlang】学習ノート-actorモデル

2294 ワード

erlangは同時プログラミング向けであり、同時可能なコアはactorモデルであり、actorモデルを理解することが重要であり、もちろんactorモデルはerlang特有のものではない.他の言語やライブラリにも役立ちます.たとえば、Elixir、Akka(for the JVM)、Celluloid(for Ruby)などです.
従来の同時実装では、マルチスレッドやマルチプロセス、複数のリクエストが来たときに共有メモリを入れ、ロックによって正しい処理結果を達成するのが一般的ですが、ロックは性能上の損失やデバッグの困難など多くの問題をもたらします.

Actorモデルはどのように同時実行を実現しますか


erlangでは、プロセスは最小の単位であり、1つのプロセスはactorであり、erlangプロセスとシステムプロセスは概念ではなく、erlangプロセスはerlang仮想マシン上で実行される軽量レベルの単位であり、瞬時に1万個以上を作成することができ、erlangプロセスを作成するには300文字のメモリ空間が必要であり、作成時間は数マイクロ秒であり、コアごとに1つのスレッドがスケジューラとして機能し、各プロセス間でメモリを共有しない.互いにメッセージを送ることで通信を行い,各プロセスには独自のプロセスメールボックスがあり,受信したメッセージは順番に入れて取り出し処理する.1つのactorが独立して動作し、互いにメッセージをやり取りし、まるでひそひそと話しているように、actorモデルが実現した同時性である.
1つのactorモデルがメッセージを受信すると、次の3つのことを選択できます.
    1>Create more actors; その他のactorsの作成
    2>Send messages to other actors; 他のactorsにメッセージを送信
    3>Designates what to do with the next message. 次のメッセージが来る動作を指定します.
Erlangの同時プログラミングで使用されるerlang関数.
Pid = spawn(Mod,Func, Args) 
 Mod  Fun(),Args  。

Pid ! Message 
  Pid  。 , 。

receive… end 
 , 。

各actorはメッセージを順番に処理するしかなく、一度に1つしか処理できないので、10つのメッセージを並列に処理する場合は、このメッセージを10個のactorsに送る必要があります.

エラーの予防と処理


1、プロセスの状態を定義する:再帰関数を利用して、プロセスの状態を再帰関数のパラメータに保存する
2、隠しメッセージ実装:関数を使ってメッセージの受信と送信を処理する
3、タイムアウト処理(デッドロック防止)はreceive文の一部であり、Delay単位はミリ秒であり、タイムアウト後にMatchモードに一致するメッセージが受信されず、after部分を実行する.
receive 

    Match -> Expression1

after Delay ->

    Expersion2

end.

4.選択的受信:受信したメッセージをネストコールで優先順位付けするが、無駄なメッセージが多すぎるとパフォーマンスが低下する
5、メールボックスのリスクの解決:一致しないメッセージの処理があることを確保し、ログを打って、bugのデバッグを便利にする

マルチプロセスでの効率的な処理エラー


1、リンク:2つのプロセス間の特殊な関係であり、1つのプロセスが意外に死亡した場合、リンク関係のあるプロセスも死亡し、エラーの蔓延を阻止し、リンク関数を確立する:link/1、パラメータはpidであり、現在のプロセスとpidのリンクを確立し、プロセスがリンクの確立に成功する前に死亡することを防止するためにspawn_を提供したlink関数は、作成プロセスと確立リンクを原子操作にカプセル化します.
2、プロセスを再起動する:システムプロセスはプロセスが死亡しているかどうかを検査し、死亡プロセスを再起動することができ、process_flag(trap_exit,true)はerlangプロセスのシステム転送プロセスを実現する.
3、モニタ:特殊なリンク、モニタは一方向で、2つのプロセスの間に複数のモニタを設置することができ、モニタは重ね合わせることができ、各モニタには独自の標識があり、単独で削除することができ、モニタを作成する:erlang:monitor/2、最初のパラメータは永遠に原子processで、2番目のパラメータはプロセスpidである.プロセスの死活を監視し、プロセスを作成し、同時にプロセスを監視する:spawn_monitor.
4、プロセスに名前を付けて、プロセスが死亡した後に再起動するのを便利にする:erlang:register(Name,Pid).プロセスが死亡すると自動的に名前が失われます.