sleep until condition is true in ruby

后端 未结 4 1663
盖世英雄少女心
盖世英雄少女心 2021-02-05 11:12

Is there any better way in Ruby to sleep until some condition is true ?

loop do 
  sleep(1)
  if ready_to_go
    break
  end
end
相关标签:
4条回答
  • 2021-02-05 11:31

    You can use the waitutil gem as described at http://rubytools.github.io/waitutil/, e.g.

    require 'waitutil'
    
    WaitUtil.wait_for_condition("my_event to happen", 
                                :timeout_sec => 30,
                                :delay_sec => 0.5) do
      check_if_my_event_happened
    end
    
    0 讨论(0)
  • 2021-02-05 11:33

    I like this form since it is simple and only uses sleep if needed after it tests for the done condition:

    begin
      ready_to_go = do_some_action
    end until ready_to_go or not sleep 1
    
    0 讨论(0)
  • 2021-02-05 11:34

    until can be a statement modifier, leading to:

    sleep(1) until ready_to_go
    

    You'll have to use that in a thread with another thread changing ready_to_go otherwise you'll hang.

    while (!ready_to_go)
      sleep(1)
    end
    

    is similar to that but, again, you'd need something to toggle ready_to_go or you'd hang.

    You could use:

    until (ready_to_go)
      sleep(1)
    end
    

    but I've never been comfortable using until like that. Actually I almost never use it, preferring the equivalent (!ready_to_go).

    0 讨论(0)
  • 2021-02-05 11:43
    def sleep_until(time)
      time.times do
        break if block_given? && yield
        sleep(1)
      end
    end
    

    Usage:

    sleep_until(18){till_i_die}
    
    0 讨论(0)
提交回复
热议问题