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

          2010-03-02
        id:sleepy_yoshi
     (SUHARA YOSHIHIKO)
なんぞこれ?
• ゆとり向けErlang入門
 – 今回はメッセージパッシングの解説


• 対象読者
 – 基本的なErlang が 可能であること
 – ゆとりという自覚があること
 – 5分間の学習時間に耐える覚悟があること

     ...
10秒で学ぶ
メッセージパッシング


             2
Erlangではたくさんの
プロセスが     に く


                3
各プロセスは
自分のポストを持つ


            4
プロセス間の通信は
メッセージで われる

プロセス間のメッセージ
= 手紙

              5
すなわち



       6
プロセス間の通信は
手紙の送受信で われる



  ある
         ある
 プロセス
        プロセス
               7
10秒で学ぶ
メッセージパッシング
    (終)


             8
(一言でいうと)
メッセージパッシング
    は  だ!

         9
メッセージパッシングの れ
                        (2) ポスト
(1) 手紙を                   に入る
   発送


                hello
    Pid1        ...
Erlangシェルで確認 (1/2)
• シェルのプロセスIDを知る: self()
• プロセスIDの指定方法: pid(x,x,x)
 – 自分に送信するのでself()でも い
• メッセージを送信: <pid> ! <message>
...
Erlangシェルで確認 (2/2)
• メッセージの確認
 – (1) receiveを使う
 – (2) flush()でダンプ


       > receive Msg -> Msg end.
       hoge
       >...
イメージ図1: 手紙の送信
• 自分自身 (シェルプロセス) へ手紙を3通送信




        シェル           piyo
                       piyo
        プロセス


        ...
イメージ図2: 手紙の開封
          last
                            (2) flush()でダンプ
                  piyo
                   piyo

シ...
自分 (シェル) 以外にも
メッセージを送りたい!


                15
でもプロセスの作り方が
  わからない...


              16
そこで!

       17
5秒で学ぶ
プロセスの作り方


           18
プロセスID
                を返す

spawn(モジュール名, 関数名, [引数,...])




                               19
spawn
    20
5秒で学ぶ
プロセスの作り方
    (終)


           21
プロセスの作り方
• spawn(モジュール名, 関数名, [引数,...])

ソースコード                  Erlangシェル

-module(yutori).        1> Pid = spawn(yutori,...
プロセスの確認方法
• i() で生成したプロセスを確認できる


  (先ほどの続き)
  3> i().
  ...
  <0.38.0> yutori:loop/0   233   3   0
           yutori:loop...
解説: loop()
• 末尾再帰によってreceive文を            も


       -module(yutori).
       -compile(export_all).
                       ...
解説: シェルプロセス
• spawnによってプロセス生成
 – PidにプロセスID保持
• 生成したプロセスにメッセージ送信
• プロセスからの返り値を受け取る

   1> Pid = spawn(yutori,loop,[]).
   ...
プロセスの生成はspawn



                26
プロセスの生成
   (終)


          27
メッセージパッシングに
    戻ります


              28
receive文の
 基本ルール


            29
先に到着した手紙からチェック (1/3)
    last

           piyo
            piyo

                   > receive
           fuga
            ...
先に到着した手紙からチェック (2/3)
    last

           piyo
            piyo

                   > receive
           fuga
            ...
先に到着した手紙からチェック (3/3)
    last

           piyo
            piyo

                   > receive
                     Msg -> ...
receive文が
パターンマッチに
 失敗する場合


             33
マッチする手紙がある場合
• マッチする手紙まで飛ばす

     last

             piyo
              piyo   > receive
                       fuga -> ag...
マッチする手紙がない場合
• マッチする手紙が無い場合待ち続ける

     last

             piyo
                     > receive
              piyo
         ...
手紙の返事を返したい!



              36
返事を書くためには?
                      返信先 (Pid1) の
• 返信先を知る必要がある         ことを知ってい
                       る必要がある


  Pid1        ...
(方法1) あらかじめ返信先を知る
• こんな感じで関数への引数として保持しておく
      loop(From)->
        receive
          Msg ->
            From ! olleh,
  ...
(方法2) 手紙に返信先を書いてもらう
• メッセージに自プロセスIDを記述
  – : Pid2 ! {self(), hello}.

        loop()->
          receive
            {From...
まとめ



      40
学んだこと
• メッセージの送信方法: !

• メッセージの開封方法: receive
 – パターンマッチによる開封順序の違い

• プロセスの作り方: spawn
 – 末尾再帰によるメッセージ待機
 – メッセージの返信方法

• Er...
習
• プログラミングErlang8       プログラミング




       この   の1,000倍ためになります
                                 42
おしまい



       43
Upcoming SlideShare
Loading in …5
×

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

5,171 views

Published on

ゆとり向けErlang入門.メッセージパッシングに関する資料.

Published in: Technology, News & Politics
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,171
On SlideShare
0
From Embeds
0
Number of Embeds
1,489
Actions
Shares
0
Downloads
20
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

ゆとり向け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

×