Skip to content

Instantly share code, notes, and snippets.

@kagamilove0707
Last active January 1, 2016 07:09
Show Gist options
  • Save kagamilove0707/8109412 to your computer and use it in GitHub Desktop.
Save kagamilove0707/8109412 to your computer and use it in GitHub Desktop.
並列化時代のためのFizzBuzzですー>ω<
#################################################################
#並列化時代のためのFizzBuzzです~>ω<
#Author : 月影
#Date : 2013/12/24
#License : お好きにどうぞ(Public Domainというやつですー>ω<)
#Comment : 聖なる夜に何をやっているんでしょう……( ̄▽ ̄ll)
#################################################################
#プログラムを止める際に実行されますです~>ω<
#下の方で無限ループしているので、Ctrl-Cで止めてくださいです(≧∇≦)b
Signal.trap:INT do
puts "Good-bye^^"
exit 0
end
#FizzBuzzを表示する1ステップにかかる時間です~>ω<
#小さくするほど速度は上がりますが、その分精度が悪くなりますです><
#また、実行環境や実行時のCPUの状態にも依存すると思うのです!
stepTime = 0.01
#出力するデータが入る配列ですー>ω<
output = []
#スレッド間でoutputを共有するためのMutexです(ところでMutexの訳って何なのです??)
m = Mutex.new
#3ステップ毎にoutputにFizzを追加するスレッドですー>ω<
fizz = Thread.new do
loop do
sleep 3 * stepTime
m.synchronize { output << :Fizz }
end
end
#5ステップ毎にoutputにBuzzを追加するスレッドですー>ω<
buzz = Thread.new do
loop do
sleep 5 * stepTime
m.synchronize { output << :Buzz }
end
end
#表示がFizzやBuzzが追加されたあとに行なわれるように、sleepを入れますです(* ̄∇ ̄*)
sleep stepTime / 10.0
#メインとなる無限ループですー>ω<
(1..Float::INFINITY).each do |i|
#ここでMutexをsleepしている間に恐らく、FizzやBUzzの追加が行なわれようとしますが、止められます。
m.synchronize { m.sleep stepTime }
#ここで、止まっていたFizzやBuzzの追加が実行されます。
#出力している間にoutputを更新されても困るので、ここもsynchronizeしておきますです>ω<
m.synchronize do
puts output.empty? ? i : output.sort.reverse.join
output = []
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment