Skip to content

Commit e1a3a69

Browse files
author
Bernard Pietraga
committed
Add exercise 8 and fix whitespace for no 5 from chapter 14
1 parent 455d345 commit e1a3a69

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

chapter_14/working_with_multiple_processes_5_b.exs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
defmodule Linker4 do
32
import :timer, only: [sleep: 1]
43

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
defmodule FibSolver do
2+
def fib(scheduler) do
3+
send scheduler, {:ready, self()}
4+
receive do
5+
{:fib, n, client} ->
6+
send client, {:answer, n, fib_calc(n), self()}
7+
fib(scheduler)
8+
{:shutdown} ->
9+
exit(:normal)
10+
end
11+
end
12+
13+
defp fib_calc(0), do: 0
14+
defp fib_calc(1), do: 1
15+
defp fib_calc(n), do: fib_calc(n - 1) + fib_calc(n - 2)
16+
end
17+
18+
defmodule Scheduler do
19+
def run(num_processes, module, func, to_calculate) do
20+
(1..num_processes)
21+
|> Enum.map(fn(_) -> spawn(module, func, [self()]) end)
22+
|> schedule_processes(to_calculate, [])
23+
end
24+
25+
defp schedule_processes(processes, queue, results) do
26+
receive do
27+
{:ready, pid} when length(queue) > 0 ->
28+
[next|tail] = queue
29+
send pid, {:fib, next, self()}
30+
schedule_processes(processes, tail, results)
31+
32+
{:ready, pid} ->
33+
send pid, {:shutdown}
34+
if length(processes) > 1 do
35+
schedule_processes(List.delete(processes, pid), queue, results)
36+
else
37+
Enum.sort(results, fn {n1, _}, {n2, _} -> n1 <= n2 end)
38+
end
39+
40+
{:answer, number, result, _pid} ->
41+
schedule_processes(processes, queue, [{number, result} | results])
42+
end
43+
end
44+
end
45+
46+
to_process = [37,37,37,37]
47+
48+
Enum.each 1..10, fn num_processes ->
49+
{time, result} = :timer.tc(
50+
Scheduler, :run,
51+
[num_processes, FibSolver, :fib, to_process]
52+
)
53+
54+
if num_processes == 1 do
55+
IO.puts inspect result
56+
IO.puts "\n # time (s)"
57+
end
58+
59+
:io.format( "~2B ~.2f~n", [num_processes, time/1000000.0])
60+
end
61+
62+
# [{37, 24157817}, {37, 24157817}, {37, 24157817}, {37, 24157817}]
63+
64+
# # time (s)
65+
# 1 6.36
66+
# 2 3.31
67+
# 3 3.55
68+
# 4 2.06
69+
# 5 1.95
70+
# 6 1.95
71+
# 7 1.88
72+
# 8 1.91
73+
# 9 2.10
74+
# 10 2.08

0 commit comments

Comments
 (0)