私が書いている方法の目的は、ブロック引数内で呼び出されるすべてのメソッドを並列に実行することです。Ruby TracePointでは、トレース対象のコールの実行を強制停止できますか?
ブロック内の各メソッドが呼び出されたとき、プロセスをフォークしてメソッドを呼び出すタイミングを決定するために使用しているTracePointを使用していますが、デフォルトメソッドの実行を停止する方法が見つからない。
TracePointブロック内でdefine_singleton_methodを使用して呼び出されているメソッドを再定義しようとしましたが、NEXT実行のメソッドが正しく変更されましたが、現在の実行は変更されません。トレース中のメソッドの実行を停止する方法はありますか?あるいは、TracePointを使わずに目標を達成する方法がありますか?
例示するためにいくつかの単純化されたコード:
def my_method(&block)
trace = TracePoint.new(:call) do |tp|
tp.disable
method = tp.self.method(tp.method_id)
@args = []
method.parameters.each { |param|
@args.push(tp.binding.eval("#{param.last}"))
}
fork do
# This executes the method in it's own process with the same
# arguments given in the traced call
result = method.call(*@args)
end
tp.enable
end
trace.enable
block.call
trace.disable
end
を自分のコードは、トレースポイントのブロック内で実行されますとblock.call戻る前に、ブロック内のメソッドがメイン処理に再び実行されます後。それをどうやって防ぐことができますか?
私は、BlankSlate Proxyクラスを使用して別の方法で問題を解決しました。このソリューションはhttps://github.com/samwoods1/in-parallelでご覧いただけます。私はまだ答えが不思議であるので、この質問を開いておきます。 –