Skip to content

Instantly share code, notes, and snippets.

@shibacow
Last active September 23, 2015 16:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shibacow/c96f330501a721f6cd53 to your computer and use it in GitHub Desktop.
Save shibacow/c96f330501a721f6cd53 to your computer and use it in GitHub Desktop.
マルチコア環境下でelxirでどの程度マルチコアを利用するか評価する。こちらに記事を書いた。 http://qiita.com/shibacow/items/8f2e8aaff0febb70b934
require Logger
defmodule KV do
def start_link do
Task.start_link(fn -> loop(%{}) end)
end
defp loop(map) do
receive do
{:get,key,caller} ->
send caller,{:get,:ok,Map.get(map,key)}
loop(map)
{:put,key,value} ->
loop(Map.put(map,key,value))
{:size,caller} ->
send caller,{:size,:ok,Map.size(map)}
loop(map)
end
end
end
defmodule PTest do
defp pdebug(v,v2) do
num = length Process.list()
Logger.debug "#{v} #{v2} num=#{num}"
end
def test(n) do
{:ok,pid} = KV.start_link
lst = Enum.to_list 1..n
#p2 = spawn(fn -> loop end)
Enum.each(lst,fn(x) ->
#IO.puts(x)
key = "key_#{x}"
value = "value_#{x+1}"
pdebug("put","send")
send pid,{:put,key,value}
{:ok,tsk}=Task.start_link(fn -> loop() end)
send pid,{:get,key,tsk}
#send pid,{:size,tsk}
end)
end
defp loop do
receive do
{:get,:ok,value} ->
pdebug("get","receive")
#IO.puts("value=" <> value)
Logger.info "value=#{value}"
#loop()
{:size,:ok,value} ->
pdebug("size","receive")
#IO.puts("size=#{value}")
Logger.info "size=#{value}"
#loop()
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment