ヽ(´・肉・`)ノログ

How do we fight without fighting?

Guild答え合わせ

DockerコンテナでGuildが使えるRubyを起動させることに成功したので,以前Guildの発表資料を読んで思ったことで書いた想像上のGuildとの挙動の答えあわせをする.

Classオブジェクトを拡張したときの挙動

class Greeting
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def greet
    "hello, #{name}!"
  end
end

g1 = Guild.new do
  loop do
    name = Guild.receive
    Guild.parent << Greeting.new(name).greet
  end
end

g1 << "niku"
puts Guild.receive
# 予想: "hello, niku!" になりそう
# => hello, niku!

class Greeting
  def greet
    "hi, #{name}!"
  end
end

g1 << "niku"
puts Guild.receive
# 予想: クラスオブジェクトが拡張されたらコピーされるだろうから "hello, niku!" のままになるのかなあ?
# => hi, niku!
# クラスオブジェクトはコピーされていないようだ.クラス拡張の挙動は私の予想と違った.

g2 = Guild.new do
  loop do
    name = Guild.receive
    Guild.parent << Greeting.new(name).greet
  end
end

g2 << "niku"
puts Guild.receive
# 予想: "hi, niku!" になりそう
# => hi, niku!

g3 = Guild.new do
  class Greeting
    def greet
      "goodby, #{name}!"
    end
  end

  loop do
    name = Guild.receive
    Guild.parent << Greeting.new(name).greet
  end
end

g3 << "niku"
puts Guild.receive
# 予想: "goodby, niku!" になりそう
# => goodby, niku!

puts Greeting.new("niku").greet
# 予想: "hi, niku!" になりそう
# => goodby, niku!

Guildでクラス拡張したものは,今までのRubyと同じようにクラス拡張されるようだ. それは今までのRubyと同じ挙動といういい面もあるが,複数のGuildで同じクラスを利用しているとき,クラス拡張のタイミングによってプログラムの動作が異なってしまうマルチスレッディングの難しさが残っているように感じた.

返り値

g1 << "niku"= の返り値は与えられた引数 =niku だと予想していたけれど nil だった. 妥当なように思う.

timeout

希望なので試していない.

プロセスのスケジューリングの公平さ

試してない.

Guild内で起きたエラー

g1 = Guild.new do
  x = Guild.receive
  if x == "boom!"
    raise "boom!"
  else
    Guild.parent << "done"
  end
end

begin
  g1 << "boom!"
  sleep 5
  # 子Guildでエラーになっても親Guildは影響を受けず動作を継続してほしいなあ.
  # 子Guildのスタックトレースとか取れた方がいいのかな.私は不要だと思う.
  puts "the parent works!"
rescue
  puts "the parent doesn't work..."
  p $!
end

# 予想: "the parent works!" が返ってくるといいなあ
# => the parent works!

GuildでハンドリングしないエラーはGuild単位で止まるようだ. こういうプロセスの分離があるとうれしい.

さらにGuildの親がコールバック形式で登録しておくとエラーがおきたときにすぐに知ることのできる仕組み(ErlangVMでいうところのモニター)があると最高だ. それがあるかどうかは,資料からはみつけられなかった.

まとめ