04
ม.ค.
10

เอิร์ลแลง(Erlang) concurrent programming ตอน 2 ส่ง Message

คราวที่แล้วเราสร้าง process ด้วย spawn ไปแล้ว คราวนี้เราจะมาดูวิธี ส่ง และ รับ message ระหว่าง processes

การเขียนฟังก์ชันให้รอรับ message นั้นใช้คีย์เวิร์ด receive …. end. ตัวอย่างเช่น

-module(chat).
-export([alert/0]).

alert () ->
        receive
                Any ->
                        io:format("Alert : ~w~n",[Any])
        end.

ตรงระหว่าง receive กับ end นั้นจะเป็น pattern ของ message และ action เมื่อเจอ message pattern นั้นส่งมาหา process ที่กำลังทำงานฟังก์ชันนี้อยู่

ทีนี้ วิธีการส่ง message ไปหา process จะใช้รูปแบบนี้

Eshell V5.7.2  (abort with ^G)
1> c(chat).
{ok,chat}
2> PID = spawn(chat,alert,[]).
<0.42.0>
3> PID ! hello.
Alert Hello: hello
hello
4> halt().

โดยที่ทางซ้ายคือ PID (process id) ส่วนทางขวา จะเป็น message ที่ต้องการส่ง

receive end. จะรอรับ message แต่ครั้งเดียว เมื่อมี message ส่งมาแล้วก็จะหยุด แต่ถ้าเราต้องการให้ process รอรับ message อีกรอบ ก็ให้เรียกซ้ำฟังก์ชันอีกครั้งแบบนี้

-module(chat).
-export([alert/0]).

alert () ->
        receive
                Any ->
                        io:format("Alert : ~w~n",[Any])
        end,
        alert().
Advertisements

1 Response to “เอิร์ลแลง(Erlang) concurrent programming ตอน 2 ส่ง Message”


  1. พฤศจิกายน 25, 2016 ที่ 9:15 am

    เมื่อเราเห็นคำถามเช่นนี้เราจะแก้ปัญหาอย่างไร เปันภาษาเอีล์แลัง (Erlang) ขอรับ

    In this exercise we are going to implement a new version of the demonstrated parallel map function: parmapn/3

    It takes an integer ( N) as the first argument to represent the number of worker processes to start, a list of elements ( List) and a function (F )to apply on the elements of the list. We should define two function: one to represent the worker process and one for the supervisor / manager.
    pmap:worker/0
    Define a function worker/0 that repeatedly receives elements from the supervisor, performs the given operation F, and send back the result to the supervisor.

    pmap:parmapn/3
    Define a function parmapn/3that:
    • start a dispatcher process and a collector process
    • starts as many worker processes as the input argument N
    • waits for the results from the collector process

    pmap:dispatcher/0
    Define a function dispatcher/1 that repeatedly sends the elements of the input list to the worker processes. Sending the elements of the lists should not overload the processes. So send an element to a process and only send the next element when it finished the computation on the former element (the worker may notify the dispatcher that it finished the computation).

    pmap:collector/0
    Define a function collector/0 that repeatedly receives elements from the worker processes and sends it to the supervisor in the order of the original list:

    There are some points where we do not restrict the implementation. You may modify the arguments of the non interface function (the only interface is pmap:parmapn/3). So you can decide whether you initialize the processes with some input arguments or send them as messages.

    To test your implementation you may use the pmap_ord function defined on the lab:
    seventh:par_map(fun mapdc:fib/1, [37,36,35]) == pmap:parmapn(12, fun mapdc:fib/1, [37,36,35])


ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s


%d bloggers like this: