From: Robert Klemme Date: 2011-11-25T16:54:36+09:00 Subject: Re: set logger.progname on a per thread basis On Fri, Nov 25, 2011 at 3:26 AM, Kassym Dorsel wrote: > I have this : > >    class Stress >      def initialize(user, pass) >        @user = user >        @pass = pass >        @agent = Mechanize.new do |a| >          a.user_agent_alias = 'Windows Mozilla' >          a.history.max_size = 0 >          a.log = my_log >          a.log.progname = @user >        end >      end >      def browse >      @agent.log.progname = @user >      # open/close page >      end >    end > >    my_log = Logger.new('dump.log') >    my_log.level = Logger::DEBUG >    atom = Mutex.new > >    for i in (Attempts_start..Attempts_end) >      threads << Thread.new(Creden_base + i.to_s) do |user| >        stress = Stress.new(user, user) >        for j in (0..Attempts_req) do >            atom.synchronize {stress.browse} # has to be atomic >        end >      end >    end > > The above code correctly identifies the different threads by the user by > setting the progname, but the problem is I have to use the Mutex class > to synchronize it, thus loosing the parallel computing since I have to > wait for the request to be sent and received before continuing. > > Is there a way to do this without using the Mutex class. Have the > progname set on a per thread basis while running the threads in > real-time parallel. That depends on the implementation of the Logger you are using (which one btw.?). However, your lock has far too big scope. You only need to lock access to the shared resource (the Logger instance) - not the whole invocation of Stress#browse since you an instance of Stress per thread. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/