Forum: Ruby New to ruby, using threads

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Poncho Q. (Guest)
on 2008-12-04 04:05
I'm trying to schedule some task using ruby threads

This work great:

t = Thread.new do
  while true do
    puts "Starting new job at #{Time.now}"
    do_something
    sleep 3
  end
end
t.join

But when the task take a long, like:

def do_something
  puts "doing something at#{Time.now}"
  sleep(rand(3))
end

I cant get the "Starting new job" message appears in regular intervals
of 3 seconds. What I'm missing?

Thanks
Rodrigo B. (Guest)
on 2008-12-04 04:40
def do_something
  puts "doing something at#{Time.now}"
  STDOUT.flush
  sleep(rand(8))
end


t = Thread.new do
  while true do
    puts "Starting new job at #{Time.now}"
    do_something
    sleep 3
  end
end
t.join

The problem is not the thread is the terminal where you are working on.
Try using STDOUT.flush ...

[te la bañaste con lo del parangaricutirimicuaro]

-r.
Louis-Philippe (Guest)
on 2008-12-04 04:50
(Received via mailing list)
hi Poncho,
what you want to do is probably have two parallel threads,
so, try something like:

t1 = Thread.new do
 while true do
   puts "Starting new job at #{Time.now}"
   sleep 3
 end
end

t2 = Thread.new do
  loop do
    do_something
  end
end

t1.join



2008/12/3 Poncho Q. <removed_email_address@domain.invalid>
Magicloud (Guest)
on 2008-12-04 05:42
(Received via mailing list)
The main problem is you have a little misunderstand of thread.
Based on your code, when the child thread is forked, there is nothing
more for the main thread to do. So it joins the child thread
immediately. And what is the child thread doing? Sleeping. So it looks
like your program is sleeping.
Robert K. (Guest)
on 2008-12-04 09:30
(Received via mailing list)
On 04.12.2008 02:59, Poncho Q. wrote:
> end
> of 3 seconds. What I'm missing?
You're sleeping 3 seconds plus whatever rand(3) returns in your thread -
so the intervals have varying length.  Basically in your code you do not
use threads properly because there is just one thread active (main
thread joins t and just sits there and waits for t to complete).

You probably rather wanted this

loop do
   puts "Starting new job at #{Time.now}"
   Thread.new do
     do_something
   end
   sleep 3
end

Note, since you have an infinite loop anyway you do not need to join the
thread.

Cheers

  robert
Brian C. (Guest)
on 2008-12-04 11:02
Poncho Q. wrote:
> I'm trying to schedule some task using ruby threads
>
> This work great:
>
> t = Thread.new do
>   while true do
>     puts "Starting new job at #{Time.now}"
>     do_something
>     sleep 3
>   end
> end
> t.join
>
> But when the task take a long, like:
>
> def do_something
>   puts "doing something at#{Time.now}"
>   sleep(rand(3))
> end
>
> I cant get the "Starting new job" message appears in regular intervals
> of 3 seconds. What I'm missing?

It works just fine for me (ruby-1.8.6p114, ubuntu hardy). Note that
rand(3) returns either 0, 1 or 2; it's not going to be easy to see the
delay varying.

It's clearer if you print Time.now.to_f

Starting new job at 1228381283.09741
doing something at1228381283.12344
Starting new job at 1228381288.13136   << + 5
doing something at1228381288.13152
Starting new job at 1228381291.13536   << + 3
doing something at1228381291.13553
Starting new job at 1228381296.14337   << + 5
doing something at1228381296.14353

Or change rand(3) to rand(10).
Brian C. (Guest)
on 2008-12-04 11:08
Brian C. wrote:
>> I cant get the "Starting new job" message appears in regular intervals
>> of 3 seconds. What I'm missing?
>
> It works just fine for me (ruby-1.8.6p114, ubuntu hardy).

Of course, this assumes that what you've written is what you want:

- Start a single thread
- Within this thread:
  - call do_something *and wait for it to finish*
  - sleep 3 seconds
  - loop around again

Clearly the total time taken for each iteration of this loop is the time
taken in do_something, plus 3 seconds, plus a small amount of overhead.
This topic is locked and can not be replied to.