erlangを初めて使うconcurrent

5424 ワード

驚くべき並列性能でなければ、このような言語を勉強することはほとんど考えられません.並列しているので、ソフトウェアで書いた回路板を見ました.そうです.ほとんどコンピュータを論理的なチップに変えました.
ここからのルーチン:http://www.erlang.org/doc/getting_started/conc_prog.
 
例1体験concurrent
-module(tut14).

-export([start/0, say_something/2]).

say_something(What, 0) ->
    done;
say_something(What, Times) ->
    io:format("~p~n", [What]),
    say_something(What, Times - 1).

start() ->
    spawn(tut14, say_something, [hello, 3]),
    spawn(tut14, say_something, [goodbye, 3]).
最後の二行を除いて、これは私達の前で習ったのと同じです.最後の二行は新鮮なBIFが現れました.spawn()は三つのパラメータがあります.
1.パラメータ2のモジュール名
2.新しいプロセスを起動したら、どの関数を実行しますか?
3.パラメータ2に渡すパラメータ
二つのspawn()は実際には新しいプロセスだけを使用しています.一つはsay_を実行するためのものです.something(hello,3)は、say_を実行するために使用されます.something(goodbye、3).もちろん、彼らは同時に実行しています.
> c(tut14).
{ok,tut14}
> tut14:say_something(hello, 3).
hello
hello
hello
done
> tut14:start().
hello
goodbye
<0.39.0>
hello
goodbye
hello
goodbye
 
例2メッセージの送信と受信
通常の意味では、プロセスは独立して実行され、リソースを共有しないと考えられています.スレッドは共有リソースが必要です.私たちは資源を共有しないので、ここで並行しているのをプロセスといいます.しかし、資源を共有しないなら、プロセス間通信はどうすればいいですか?事実上、仕組みは唯一である:メッセージ.上記のようなプロセスのpidに従ってメッセージを送ることができます.
-module(tut15).
-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("ping finished~n", []);

ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).

pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    Pong_PID = spawn(tut15, pong, []),
    spawn(tut15, ping, [3, Pong_PID]).
上のコードには二つの顔が現れています.
1、Pong_PIDfinishedこれは前述のメッセージ送信です.
2、receive…end.この文はメッセージを受信するためのものです.pong()のfinishedとping、PinguPIDは二つの整合条件であり、受信したメッセージがこれかあれば、その後どうなるかを表しています.受信したメッセージがfinishedであれば、ioに出力します.
3、Pong_PIDはspawnから戻りますが、Ping_PIDはself()関数を呼び出して取得します.
実行の結果は:
> c("tut15").
{ok,tut15}
> tut15:
module_info/0  module_info/1  ping/2         pong/0         start/0        

> tut15:start().
Pong received ping
<0.47.0>
Ping received pong 
Pong received ping
Ping received pong 
Pong received ping
Ping received pong 
ping finished 
Pong finished
初めての他に、もう一つの「別名」という仕組みがあります.私たちはregisterを使って、プロセスに名前をつけます.これで私たちはメッセージを送る時、PIDによってではなく名前を使えばいいです.私達はやはり上の例を使って、ただregisterを導入しました.PID:
-module(tut15).

-export([start/0, ping/1, pong/0]).

ping(0) ->
    pong ! finished,
    io:format("ping finished~n", []);
...

start() ->
    register(pong, spawn(tut15, pong, [])),
    spawn(tut15, ping, [3]).
以上のように、registerは、最初のパラメータはAtomであり、二つ目のパラメータはspawnが戻ってくるプロセスIDである.
 
一斑を見て全豹を知る.