erlangを初めて使うconcurrent
5424 ワード
驚くべき並列性能でなければ、このような言語を勉強することはほとんど考えられません.並列しているので、ソフトウェアで書いた回路板を見ました.そうです.ほとんどコンピュータを論理的なチップに変えました.
ここからのルーチン:http://www.erlang.org/doc/getting_started/conc_prog.
例1体験concurrent
1.パラメータ2のモジュール名
2.新しいプロセスを起動したら、どの関数を実行しますか?
3.パラメータ2に渡すパラメータ
二つのspawn()は実際には新しいプロセスだけを使用しています.一つはsay_を実行するためのものです.something(hello,3)は、say_を実行するために使用されます.something(goodbye、3).もちろん、彼らは同時に実行しています.
例2メッセージの送信と受信
通常の意味では、プロセスは独立して実行され、リソースを共有しないと考えられています.スレッドは共有リソースが必要です.私たちは資源を共有しないので、ここで並行しているのをプロセスといいます.しかし、資源を共有しないなら、プロセス間通信はどうすればいいですか?事実上、仕組みは唯一である:メッセージ.上記のようなプロセスのpidに従ってメッセージを送ることができます.
1、Pong_PIDfinishedこれは前述のメッセージ送信です.
2、receive…end.この文はメッセージを受信するためのものです.pong()のfinishedとping、PinguPIDは二つの整合条件であり、受信したメッセージがこれかあれば、その後どうなるかを表しています.受信したメッセージがfinishedであれば、ioに出力します.
3、Pong_PIDはspawnから戻りますが、Ping_PIDはself()関数を呼び出して取得します.
実行の結果は:
一斑を見て全豹を知る.
ここからのルーチン: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である.一斑を見て全豹を知る.