I am planning on using ActiveSupport::Notifications and have a question
about threading. For the purposes of this question I am assuming
config.threadsafe! is enabled.
Will a subscriber execute in the same thread as the code that caused it
to
be triggered or do they run in separate threads?
The reason I ask is that I would like to do something like
In Controller Code:
def action
Module.events[Thread.current] = Event.new # Module.events returns a
hash
rest of action code
end
And elsewhere:
ActiveSupport::Notifications.subscribe
“process_action.action_controller”
do |name, start, finish, id, payload|
event = Module.events[Thread.current] # returns the Event that was
created in the controller.
Do processing on event
end
Obviously if the Subscriber runs in a different thread then this will
not
work since Thread.current will not match so I wanted to check. Note that
in
this case I do not want to pass the Event as part of the payload because
I
want to be able to use existing rails built-in notifications without
having
to modify them.
On Wednesday, September 12, 2012 2:11:41 AM UTC+1, Jeffrey J. wrote:
I would have thought that was easy to test. Currently everything happens
on the thread triggering the event. There’s also code in rails (eg
ActiveRecord’s logsubscriber) that use thread local variables in
notification processing so I wouldn’t that would be changed in a hurry.
I have done various testing using MRI and JRuby with config.threadsafe!
enabled and I THINK that it does always execute in the same thread.
However since the log files are interleaved when dealing with many
requests and logs written from the subscriber do not have access to the
request object for logging with a tag using something like uuid I cannot
be 100% sure which is why I was hoping someone would be able to give a
definitive answer.
Sorry I was talking out of my arse in the last post. Correct version:
I have done various testing using MRI and JRuby with config.threadsafe!
and it appears to work in all the tests I have thrown at it, but that
gives me 99% certainty (I could have missed soemthing).
I tried tracing through the code on github but quickly got lost which is
why I asked the question here to see if someone (who does know the code)
could give a definitive “Yes” or “no”
On Thursday, September 13, 2012 1:28:11 AM UTC+1, Jeffrey J. wrote:
And of course there’s the difference between something just happening to
behave in a certain way with the current implementation and something
which
a documented part of the interface. There’s not much in the way of
documentation around this stuff but given that existing rails internals
assume that the delivery thread is the same as the thread processing the
notification I’d say it was pretty safe to rely on.
Fred
requests and logs written from the subscriber do not have access to the
request object for logging with a tag using something like uuid I cannot be
100% sure which is why I was hoping someone would be able to give a
definitive answer.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.