2016-04-28 2 views
0

Целью метода, который я пишу, является запуск каждого метода, вызываемого в параллельном блочном аргументе.В Ruby TracePoint вы можете заставить остановить выполнение отслеживаемого вызова?

Я изучаю использование TracePoint, который я использую, чтобы определить, когда вызывается каждый метод внутри блока, где я перепрограммирую процесс и вызываю метод, однако я не могу найти способ затем остановить выполнение по умолчанию ,

Я попытался переопределить метод, вызываемый с помощью метода define_singleton_method в блоке TracePoint, который правильно изменяет метод выполнения NEXT, но текущее выполнение по-прежнему не изменяется. Есть ли способ в TracePoint остановить выполнение метода, который в настоящее время отслеживается? Кроме того, есть ли способ достичь моей цели, не используя 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, а затем поймать и игнорировать его на улице.

Смежные вопросы