2016-04-28 3 views
0

私が書いている方法の目的は、ブロック引数内で呼び出されるすべてのメソッドを並列に実行することです。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戻る前に、ブロック内のメソッドがメイン処理に再び実行されます後。それをどうやって防ぐことができますか?

+0

私は、BlankSlate Proxyクラスを使用して別の方法で問題を解決しました。このソリューションはhttps://github.com/samwoods1/in-parallelでご覧いただけます。私はまだ答えが不思議であるので、この質問を開いておきます。 –

答えて

0

TracePointコールバック内で例外を発生させ、それを捕捉して外部で無視することができます。

関連する問題