Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. defmodule Fibonacci do
  2. def of(0), do: 0
  3. def of(1), do: 1
  4. def of(n), do: of(n-1) + of(n-2)
  5. end
  6.  
  7. #Fibonacci.of(13) |> IO.inspect
  8.  
  9. defmodule Waste do
  10. def ms(n) do
  11. :timer.sleep(n)
  12. n
  13. end
  14. end
  15.  
  16. defmodule Parallel do
  17. def map(enumerable, f) do
  18. master = self
  19. enumerable
  20. |> Enum.map(&task(&1, f))
  21. |> collect
  22. end
  23.  
  24. defp collect(tasks) do
  25. timeout = 1_000
  26. reference = make_ref
  27. timer = Process.send_after(self, {:timeout, reference}, timeout)
  28. try do
  29. collect(tasks, [], reference)
  30. after
  31. :timer.cancel(timer)
  32. receive do
  33. {:timeout, ^reference} ->
  34. :ok
  35. after 0 ->
  36. :ok
  37. end
  38. end
  39. end
  40.  
  41. defp collect([], results, _), do: results |> Enum.reverse
  42. defp collect(tasks, results, reference) do
  43. receive do
  44. {:timeout, ^reference} ->
  45. {:timeout, length(results), results}
  46. message ->
  47. case Task.find(tasks, message) do
  48. {result, task} ->
  49. collect(List.delete(tasks, task), [result|results], reference)
  50. nil ->
  51. collect(tasks, results, reference)
  52. end
  53. end
  54. end
  55.  
  56. defp task(e, f) do
  57. master = self
  58. reference = make_ref
  59. spawn(fn -> send(master, {reference, f.(e)}) end)
  60. end
  61.  
  62. end
  63.  
  64. :random.seed(:os.timestamp)
  65.  
  66. 0..10
  67. |> Enum.map(fn _ -> :random.uniform(1_000) - 500 end)
  68. #|> Parallel.map(&Fibonacci.of/1)
  69. |> Parallel.map(&Waste.ms/1)
  70. |> IO.inspect
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement