Skip to content

Commit de7017d

Browse files
committed
#9 練習問題6クリア
1 parent 27aee81 commit de7017d

File tree

2 files changed

+41
-25
lines changed

2 files changed

+41
-25
lines changed
Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,39 @@
1-
defmodule WWMP3 do
2-
import :timer, only: [sleep: 1 ]
3-
4-
def child_func(pid, message) do
5-
send pid , message
6-
raise "Some error occur"
7-
end
8-
9-
def receive_func() do
10-
receive do msg -> IO.puts(msg) end
11-
receive_func()
12-
end
13-
14-
def parent_func() do
15-
spawn_link(WWMP3, :child_func, [self(), "This is message"])
16-
sleep 500
17-
receive_func()
18-
end
19-
20-
21-
def run() do
22-
parent_func()
1+
defmodule Parallel do
2+
def pmap(collection, fun)do
3+
me = self()
4+
IO.puts(" me :#{inspect me}")
5+
collection
6+
|> Enum.map(fn (elem) ->
7+
IO.puts("enume: #{inspect self()}")
8+
spawn_link fn ->
9+
IO.puts("spawn: #{inspect self()}")
10+
(send me, {self(), fun.(elem)})
11+
end
12+
end)
13+
|> Enum.map(fn (pid) ->
14+
receive do{^pid, result} -> result end
15+
end)
2316
end
2417
end
2518

26-
WWMP3.run()
27-
2819

29-
# 例外が発生し、子プロセスからのメッセージが受信できない
20+
"""
21+
selfのスコープが異なるので、メインのプロセスのpidを別途取得する必要がある
22+
23+
iex(1)> c("WorkingWithMultipleProcess06.ex")
24+
[Parallel]
25+
iex(2)> Parallel.pmap 1..5 ,&(&1 * &1)
26+
me :#PID<0.105.0>
27+
enume: #PID<0.105.0>
28+
enume: #PID<0.105.0>
29+
spawn: #PID<0.177.0>
30+
enume: #PID<0.105.0>
31+
spawn: #PID<0.178.0>
32+
enume: #PID<0.105.0>
33+
spawn: #PID<0.179.0>
34+
enume: #PID<0.105.0>
35+
spawn: #PID<0.180.0>
36+
spawn: #PID<0.181.0>
37+
[1, 4, 9, 16, 25]
38+
39+
"""

memorandum/ch14/pmap.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,9 @@ defmodule Parallel do
1010
end)
1111
end
1212
end
13+
14+
15+
"""
16+
17+
18+
"""

0 commit comments

Comments
 (0)