Skip to content

Instantly share code, notes, and snippets.

@matsu-chara
Created March 6, 2016 12:32
Show Gist options
  • Save matsu-chara/8c29266e8922372a5215 to your computer and use it in GitHub Desktop.
Save matsu-chara/8c29266e8922372a5215 to your computer and use it in GitHub Desktop.
長時間ブロックするアクターをスレッド数(デフォルトでは物理コア数)だけ用意すると全体のパフォーマンスが落ちる例(ずっとブロックして先にいかないし、GCも効かない。env.outにも処理が行かないので表示もされない)
use "collections"
actor Main
let env: Env
new create(env': Env) =>
env = env'
let ls = List[LightWorker]
let hs = List[HeavyWorker]
env.out.print("creating...")
for i in Range[U32](0, 8) do
ls.push(LightWorker(i, env))
hs.push(HeavyWorker(i, env))
end
env.out.print("heavy work...")
for h in hs.values() do
h.doWork()
end
@sleep[None](U64(3))
env.out.print("light work...")
for l in ls.values() do
l.doWork()
end
env.out.print("done")
actor HeavyWorker
let env: Env
let id: U32
var count: U64 = 0
new create(id': U32, env': Env) =>
id = id'
env = env'
env.out.print("heavy: " + id.string())
be doWork() =>
env.out.print("heavy: " + id.string() + " count = " + count.string())
while count < 1000000000 do
count = count + 1
if (count % 100000000) == 0 then
env.out.print("heavy: " + id.string() + " count = " + count.string())
end
end
actor LightWorker
let env: Env
let id: U32
var count: U64 = 0
new create(id': U32, env': Env) =>
id = id'
env = env'
env.out.print("light: " + id.string())
be doWork() =>
count = count + 1
env.out.print("light: " + id.string() + " count = " + count.string())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment