私は観察可能なオブジェクト内でProcess.fork
を使用していましたが、観察者オブジェクトのファイル出力からの出力を妨げていることがわかりました。Process.forkはRubyのファイルioに影響を与えるはずですか?
私がProcess
行をコメントアウトすると、出力されるファイルには、0〜15の番号順にそれぞれ16行が含まれます。ただし、コメントを外すと、ファイルに0〜15の間に136行の順序付けられていない数値が含まれます。 Process
がコメントアウトされているかどうかにかかわらず、正しい番号が画面に印刷されます。
この動作は部分的に期待されていますか、これはバグですか?誰かがこれを回避する方法を知っていますか?
以下のコードは問題を再現し、問題を示すのに十分なものがなくなるまで元のコードを元に戻して作成しました。 Process.fork
を使用する元の理由は、処理を高速化するためにいくつかのプロセスを作成することでした。
require 'observer'
class Recorder
def initialize(notifier, filename)
notifier.add_observer(self)
@save_file = File.open(filename, 'w')
@i = 0
end
def update
puts @i
@save_file.puts @i
@i += 1
end
def stop
@save_file.close
end
end
class Notifier
include Observable
def run
16.times do
# When the following two Process lines are uncommented,
# the file output from the Recorder above is erratic
Process.fork {exit}
Process.wait
changed
notify_observers
end
end
end
notifier = Notifier.new
recorder = Recorder.new(notifier, 'test.data')
notifier.run
recorder.stop
ありがとうございました。私はあなたの答えを編集しましたが、同期ラインは違いはありませんでしたが、原則は正しいものであり、代わりにフラッシュを使用して動作します。 –
IO#sync =あなたのために働いていないのが不思議です。あなたのコードで@ save_file.sync = trueを試したところ、ruby 1.9.2p180(2011-02-18 revision 30909)[x86_64-linux]とruby 1.8.7(2010-01-10 patchlevel 249)[x86_64 -linux] – dbenhur