Kas*_*sel 2 ruby logging multithreading mechanize
我有这个 :
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
Run Code Online (Sandbox Code Playgroud)
上面的代码通过设置progname正确识别用户的不同线程,但问题是我必须使用Mutex类来同步它,从而失去并行计算,因为我必须等待请求发送和接收之前如果我想在日志中获得正确的预测,请继续.
有没有办法在不使用Mutex类的情况下执行此操作.在实时并行运行线程的同时,以每个线程为基础设置progname.
Kas*_*sel 14
我终于找到了答案.您可以定义线程局部变量,并在日志记录时修改日志格式化程序以包含它.这是修改格式化程序的代码.
Log.formatter = proc do |severity, datetime, progname, msg|
"#{severity} [#{Time.now.strftime('%H:%M:%S')}] #{Thread.current['id']} --> #{msg}\n"
end
Run Code Online (Sandbox Code Playgroud)
在每个线程中,您将添加如下内容:
Thread.current['id'] = 'whatever'
| 归档时间: |
|
| 查看次数: |
1929 次 |
| 最近记录: |