Целью метода, который я пишу, является запуск каждого метода, вызываемого в параллельном блочном аргументе.В 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 возвращается, метод внутри блока получает снова выполняется в основном процессе. Как я могу предотвратить это?
Я решил решить проблему по-другому, используя класс BlankSlate Proxy. Вы можете увидеть решение здесь: https://github.com/samwoods1/in-parallel. Я оставлю этот вопрос открытым, хотя я все еще интересуюсь ответом. –