Phoenix / Elixir使用核心,最大限度地使用它们

时间:2017-05-25 15:46:56

标签: parallel-processing erlang elixir phoenix-framework

我创建了一个简单的函数,可以将随机消息广播到频道。我试图产生4-16个进程,但CPU使用率不会超过200%。我有8个核心。

defmodule Example do

  def listen do
    receive do
      {:ok, "rush"} ->
        sample_text = ["foo", "bar", "baz", "qux", "quux", "quuz"]
        h = Enum.take_random(sample_text, 1)
        MyApp.Endpoint.broadcast("topic", "message:new", %{body: Enum.at(h, 0, :default)})
    end

    listen()
  end
end

max = 16
list = Enum.flat_map (1..max), fn _ ->
  [spawn(Example, :listen, [])]
end

elem(:timer.tc(fn -> (1..1000000)|> Enum.each(fn x ->
  send Enum.at(list, rem(x, (max-1)), :default), {:ok, "rush"}
end)end, []),0) / 1000000

这是否连接到我的SSD,这是瓶颈还是为什么我无法最大限度地利用CPU?

这是我在启动凤凰时所得到的。

Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

1 个答案:

答案 0 :(得分:0)

它没有使用所有cpus的原因是因为我直接在控制台中定义了模块而不是编译它们。一旦我做到了,它确实按预期工作:)