2016-04-28 5 views
0

Das Ziel der Methode, die ich schreibe, ist, jede aufgerufene Methode innerhalb eines Blockarguments parallel auszuführen.In Ruby TracePoint, können Sie zwingen, die Ausführung des Anrufs zu stoppen, der verfolgt wird?

Ich erkunde mit TracePoint, die ich verwende, um festzustellen, wann jede Methode im Block aufgerufen wird, wo ich einen Prozess verzweigen und die Methode aufrufen, aber ich kann einen Weg nicht finden, um dann die Standardmethode zu stoppen .

Ich habe versucht, die aufgerufene Methode mit define_singleton_method innerhalb des TracePoint-Blocks neu zu definieren, wodurch die Methode für die NEXT-Ausführung geändert wird, die aktuelle Ausführung jedoch unverändert erfolgt. Gibt es in TracePoint eine Möglichkeit, die Ausführung der aktuell verfolgten Methode zu stoppen? Oder gibt es eine Möglichkeit, mein Ziel zu erreichen, ohne TracePoint zu benutzen?

Einige vereinfachte Code zu veranschaulichen:

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 

Nach meinem Code innerhalb des Tracepoint-Block und vor block.call zurückkehrt, wobei das Verfahren innerhalb des Blocks in den Hauptprozess ausgeführt wird erneut ausgeführt wird. Wie kann ich das verhindern?

+0

Ich löste das Problem auf eine andere Weise mit einer BlankSlate Proxy-Klasse. Sie können die Lösung hier sehen: https://github.com/samwoods1/in-parallel. Ich werde diese Frage offen lassen, da ich immer noch neugierig auf die Antwort bin. –

Antwort

0

Vielleicht könnten Sie eine Ausnahme innerhalb Ihres TracePoint-Rückrufs auslösen, und dann fangen und ignorieren Sie es außerhalb.