【Erlang】Erlangでのインスタンス作成方法

Erlangでのインスタンス作成方法

Erlangは並行処理をサポートしたプログラミング言語であり、分散システムやリアルタイムシステムなどの領域で広く使用されています。本記事では、Erlangでのインスタンス作成方法について詳しく解説します。

概要

Erlangでは、並行処理を行うためにプロセスという単位でタスクを実行します。各プロセスは独立しており、メモリを共有しないため、他のプロセスに影響を与えることなく動作します。プロセスの作成や管理はErlangの強力な機能の一つであり、効率的な並行処理を実現するための重要な要素です。

コンテンツ

  1. プロセスの作成
  2. プロセス識別子の取得
  3. プロセス間の通信
  4. プロセスの監視

1. プロセスの作成

Erlangでは、新しいプロセスを作成するために

spawn/1

spawn/3

といった組み込み関数を使用します。以下は、

spawn/1

を使用したプロセスの作成の例です。


-module(example).
-export([start/0, loop/0]).

start() ->
    spawn(?MODULE, loop, []).

loop() ->
    receive
        {From, Message} ->
            From ! Message,
            loop();
        stop ->
            ok
    end.

この例では、

start/0

関数が呼び出されると、

loop/0

関数を持つ新しいプロセスが作成されます。

loop/0

関数はメッセージを受信し、その内容に応じて振る舞いを変えます。

2. プロセス識別子の取得

プロセス識別子は、プロセスを一意に識別するための重要な情報です。Erlangでは、

self/0

関数を使用して現在のプロセスの識別子を取得することができます。


-module(example).
-export([get_pid/0]).

get_pid() ->
    self().

この例では、

get_pid/0

関数が呼び出されると、その実行元のプロセスの識別子が返されます。

3. プロセス間の通信

Erlangでは、プロセス間の通信にメッセージパッシングを使用します。プロセスは

!

演算子を使ってメッセージを送信し、

receive

式を使ってメッセージを受信します。


-module(example).
-export([send_message/1, receive_message/0]).

send_message(Pid) ->
    Pid ! {self(), "Hello, Erlang!"}.

receive_message() ->
    receive
        Message ->
            Message
    end.

この例では、

send_message/1

関数が与えられたプロセスにメッセージを送信し、

receive_message/0

関数がメッセージを受信します。

4. プロセスの監視

Erlangでは、プロセスを監視することができます。監視プロセスは、監視対象のプロセスが終了したり異常終了したりした際に通知を受け取ることができます。


-module(example).
-export([start_link/1, monitor_process/1]).

start_link(Name) ->
    spawn_link(?MODULE, loop, [Name]).

loop(Name) ->
    receive
        {From, Message} ->
            From ! Message,
            loop(Name);
        {'DOWN', _MonitorRef, process, Pid, Reason} ->
            io:format("Process ~p terminated: ~p~n", [Pid, Reason])
    end.

monitor_process(Pid) ->
    Ref = erlang:monitor(process, Pid),
    {Pid, Ref}.

この例では、

start_link/1

関数が与えられた名前を持つ新しいプロセスを作成し、

monitor_process/1

関数が指定されたプロセスを監視します。

サンプルコード

上記の各例についてのサンプルコードを以下に示します。


-module(example).
-export([start/0, loop/0, get_pid/0, send_message/1, receive_message/0, start_link/1, monitor_process/1]).

start() ->
    spawn(?MODULE, loop, []).

loop() ->
    receive
        {From, Message} ->
            From ! Message,
            loop();
        stop ->
            ok
    end.

get_pid() ->
    self().

send_message(Pid) ->
    Pid ! {self(), "Hello, Erlang!"}.

receive_message() ->
    receive
        Message ->
            Message
    end.

start_link(Name) ->
    spawn_link(?MODULE, loop, [Name]).

monitor_process(Pid) ->
    Ref = erlang:monitor(process, Pid),
    {Pid, Ref}.

まとめ

Erlangでのインスタンス作成方法について解説しました。プロセスの作成、プロセス識別子の取得、プロセス間の通信、プロセスの監視といった基本的な概念を理解することで、効率的な並行処理を実現するための基盤を築くことができます。Erlangの強力な並行処理機能を活用して、高性能かつ信頼性の高いシステムを構築するために、これらの概念を活用していきましょう。

よくある質問

  • Q. Erlangでのインスタンス作成方法は?
  • A: Erlangでは、インスタンスという概念はありません。Erlangではプロセスという単位で並行処理を行います。プロセスはspawn関数を使用して作成されます。
  • Q. Erlangのプロセスとは何ですか?
  • A: Erlangのプロセスは、軽量で並行実行されるスレッドのようなものです。それぞれのプロセスは独立して実行され、メッセージパッシングを通じて通信します。
  • Q. Erlangのspawn関数はどのように使われますか?
  • A: spawn関数は新しいプロセスを生成し、指定された関数を実行します。spawn(Module, Function, Args)のように使用し、Moduleはモジュール名、Functionは関数名、Argsは引数です。
  • Q. Erlangでプロセス間通信を行う方法は?
  • A: Erlangではプロセス間通信にメッセージパッシングを使用します。プロセスは他のプロセスに対してメッセージを送信し、受信したプロセスはそのメッセージを処理します。
  • Q. Erlangのプロセスはどのように管理されますか?
  • A: Erlangではプロセスは監視ツリーという形で階層的に管理されます。親プロセスは子プロセスを監視し、子プロセスの異常終了時に対処することができます。
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x