概要
paiza.ioでelixirやってみた。
Fibonacci Serverやってみた。
参考にしたページ
サンプルコード
defmodule FibSolver do
def fib(scheduler) do
send scheduler, {:ready, self()}
receive do
{:fib, n, client} ->
send client, {:answer, n, fib_calc(n), self()}
fib(scheduler)
{:shutdown} ->
exit(0)
end
end
defp fib_calc(0), do: 1
defp fib_calc(1), do: 1
defp fib_calc(n), do: fib_calc(n - 1) + fib_calc(n - 2)
end
defmodule Scheduler do
def run(num_processes, module, func, to_calculate) do
(1..num_processes)
|> Enum.map(fn(_) ->
spawn(module, func, [self()])
end)
|> schedule_processes(to_calculate, [])
end
defp schedule_processes(processes, queue, results) do
receive do
{:ready, pid} when length(queue) > 0 ->
[next | tail] = queue
send pid, {:fib, next, self()}
schedule_processes(processes, tail, results)
{:ready, pid} ->
send pid, {:shutdown}
if length(processes) > 1 do
schedule_processes(List.delete(processes, pid), queue, results)
else
Enum.sort(results, fn {n1, _}, {n2, _} ->
n1 <= n2
end)
end
{:answer, number, result, _pid} ->
schedule_processes(processes, queue, [{number, result} | results])
end
end
end
to_process = [9, 10, 11]
Enum.each 1..4, fn num_processes ->
{time, result} = :timer.tc(Scheduler, :run, [num_processes, FibSolver, :fib, to_process])
if num_processes == 1 do
IO.puts inspect result
IO.puts "\n # time (ms)"
end
:io.format "~2B ~.2f~n", [num_processes, time / 1000.0]
end
実行結果
[{9, 55}, {10, 89}, {11, 144}]
# time (ms)
1 1.89
2 0.04
3 0.05
4 0.07
成果物
以上。