From: Robert Klemme Date: 2005-10-21T22:01:59+09:00 Subject: Re: Threads, timing and HTTP Alexander Lamb wrote: > Hello list, > > I am implementing a very simple script to ping web servers or > services (to monitor how our environment is functionning). > > Some production url's run on more than one host. Therefore, I start a > thread for each separate url. > > The function run in my threads is: > > def doPing(uri_string, probe) > s = uri_string > while true > begin > timeout(@seconds_before_timeout) do |timeout_length| > start = Time.new > begin > open(s) do |result| > if result.status[0] != "200" > probe.addToLogFile([s,'ERR',0,result.status[1]]) > else > probe.addToLogFile([s,'OK',Time.new - start,'']) > end > end > rescue Exception > probe.addToLogFile([s,'ERR',0,$!]) > end > end > rescue Timeout::Error > probe.addToLogFile([s,'ERR',0,'timeout']) > end > sleep(@seconds_between_ping) > end > end > > However, this is a problem. Indeed, I want also to measure the time > (round-trip) it takes for the ping (these are only simple pings for > the time being). As you can see I get the local time before and after > the call. But this doesn't work with threads. Indeed, since the > process is shared among threads, the time will be dependent on the > number of threads I am running and not a correct view of the actual > time it takes to ping. > > I can't define the piece of code between the two times as critical > and only for one thread because if the open-uri blocks, it will > prevent another thread to ping another url in the mean time. > > Any idea? Maybe use processes instead of threads? Maybe you can exploit one of the result headers. Chances are that there is a timestamp somewhere. Then you *only* need to synchronize clocks on your machine and on servers... Or you switch to a single thread solution. I don't know your ping interval but if you don't need to ping too often and don't have too many servers that should be ok. You can create a simple scheduling that always picks the URL with the closest ping point... Regards robert