Successfully reported this slideshow.

ゆとり向けErlang入門 (1): メッセージパッシングことはじめ

8

Share

Upcoming SlideShare
ループその3
ループその3
Loading in …3
×
1 of 44
1 of 44

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

ゆとり向けErlang入門 (1): メッセージパッシングことはじめ

  1. 1. ゆとり向けErlang入門 (1): メッセージパッシングことはじめ 2010-03-02 id:sleepy_yoshi (SUHARA YOSHIHIKO)
  2. 2. なんぞこれ? • ゆとり向けErlang入門 – 今回はメッセージパッシングの解説 • 対象読者 – 基本的なErlang が 可能であること – ゆとりという自覚があること – 5分間の学習時間に耐える覚悟があること STOP! 上記に当てはまらない方は ここで読むのをおやめください 1
  3. 3. 10秒で学ぶ メッセージパッシング 2
  4. 4. Erlangではたくさんの プロセスが に く 3
  5. 5. 各プロセスは 自分のポストを持つ 4
  6. 6. プロセス間の通信は メッセージで われる プロセス間のメッセージ = 手紙 5
  7. 7. すなわち 6
  8. 8. プロセス間の通信は 手紙の送受信で われる ある ある プロセス プロセス 7
  9. 9. 10秒で学ぶ メッセージパッシング (終) 8
  10. 10. (一言でいうと) メッセージパッシング は だ! 9
  11. 11. メッセージパッシングの れ (2) ポスト (1) 手紙を に入る 発送 hello Pid1 Pid2 receive Pid2 ! hello. (3) 開封する Msg -> Msg end. 10
  12. 12. Erlangシェルで確認 (1/2) • シェルのプロセスIDを知る: self() • プロセスIDの指定方法: pid(x,x,x) – 自分に送信するのでself()でも い • メッセージを送信: <pid> ! <message> > self(). pid(0,31,0) ! hello <0.31.0> の値であり, > pid(0,31,0) ! hoge. 受信メッセージ ではないことに注意 hoge > pid(0,31,0) ! fuga. fuga > pid(0,31,0) ! piyo. piyo 11
  13. 13. Erlangシェルで確認 (2/2) • メッセージの確認 – (1) receiveを使う – (2) flush()でダンプ > receive Msg -> Msg end. hoge > flush(). Shell got fuga Shell got piyo ok > 12
  14. 14. イメージ図1: 手紙の送信 • 自分自身 (シェルプロセス) へ手紙を3通送信 シェル piyo piyo プロセス fuga fuga hoge hoge 13
  15. 15. イメージ図2: 手紙の開封 last (2) flush()でダンプ piyo piyo シェルプロセス fuga fuga (1) receive文で一通開封 > receive hoge hoge Msg -> Msg end. first hoge 14
  16. 16. 自分 (シェル) 以外にも メッセージを送りたい! 15
  17. 17. でもプロセスの作り方が わからない... 16
  18. 18. そこで! 17
  19. 19. 5秒で学ぶ プロセスの作り方 18
  20. 20. プロセスID を返す spawn(モジュール名, 関数名, [引数,...]) 19
  21. 21. spawn 20
  22. 22. 5秒で学ぶ プロセスの作り方 (終) 21
  23. 23. プロセスの作り方 • spawn(モジュール名, 関数名, [引数,...]) ソースコード Erlangシェル -module(yutori). 1> Pid = spawn(yutori, -compile(export_all). loop,[]). <0,38,0> loop () -> 2> Pid ! hello. receive olleh Msg -> olleh, 3> loop() end. 22
  24. 24. プロセスの確認方法 • i() で生成したプロセスを確認できる (先ほどの続き) 3> i(). ... <0.38.0> yutori:loop/0 233 3 0 yutori:loop/0 0 ... 23
  25. 25. 解説: loop() • 末尾再帰によってreceive文を も -module(yutori). -compile(export_all). メッセージの開封後 loop () -> 再びloop()開始 receive Msg -> olleh, loop() end. 24
  26. 26. 解説: シェルプロセス • spawnによってプロセス生成 – PidにプロセスID保持 • 生成したプロセスにメッセージ送信 • プロセスからの返り値を受け取る 1> Pid = spawn(yutori,loop,[]). <0,38,0> 2> Pid ! hello. olleh 3> 25
  27. 27. プロセスの生成はspawn 26
  28. 28. プロセスの生成 (終) 27
  29. 29. メッセージパッシングに 戻ります 28
  30. 30. receive文の 基本ルール 29
  31. 31. 先に到着した手紙からチェック (1/3) last piyo piyo > receive fuga fuga Msg -> Msg end. hoge hoge first hoge 30
  32. 32. 先に到着した手紙からチェック (2/3) last piyo piyo > receive fuga fuga Msg -> Msg end. first fuga 31
  33. 33. 先に到着した手紙からチェック (3/3) last piyo piyo > receive Msg -> Msg end. first piyo 32
  34. 34. receive文が パターンマッチに 失敗する場合 33
  35. 35. マッチする手紙がある場合 • マッチする手紙まで飛ばす last piyo piyo > receive fuga -> aguf end. fuga fuga hoge hoge first aguf 34
  36. 36. マッチする手紙がない場合 • マッチする手紙が無い場合待ち続ける last piyo > receive piyo fuga -> agug end. hoge hoge first 永遠に待ち続けないためのタイムアウト設定 ⇒ afterキーワード 35
  37. 37. 手紙の返事を返したい! 36
  38. 38. 返事を書くためには? 返信先 (Pid1) の • 返信先を知る必要がある ことを知ってい る必要がある Pid1 Pid2 (方法1) あらかじめPid1のことを知っておく (方法2) 手紙に返信先を書いてもらう 37
  39. 39. (方法1) あらかじめ返信先を知る • こんな感じで関数への引数として保持しておく loop(From)-> receive Msg -> From ! olleh, loop(From) end. • spawnする際に引数で返信先を与える – : spawn(yutori,loop,[self()]). 返信先が 定されている場合に 38
  40. 40. (方法2) 手紙に返信先を書いてもらう • メッセージに自プロセスIDを記述 – : Pid2 ! {self(), hello}. loop()-> receive {From,Msg} -> From ! olleh, loop() end. こんな感じで受け取る プロセス毎に返信可能 39
  41. 41. まとめ 40
  42. 42. 学んだこと • メッセージの送信方法: ! • メッセージの開封方法: receive – パターンマッチによる開封順序の違い • プロセスの作り方: spawn – 末尾再帰によるメッセージ待機 – メッセージの返信方法 • Erlangシェルの使い方 – pid(), flush(), i() 41
  43. 43. 習 • プログラミングErlang8 プログラミング この の1,000倍ためになります 42
  44. 44. おしまい 43

×