[#15359] Timeout::Error — Jeremy Thurgood <jerith@...>

Good day,

41 messages 2008/02/05
[#15366] Re: Timeout::Error — Eric Hodel <drbrain@...7.net> 2008/02/06

On Feb 5, 2008, at 06:20 AM, Jeremy Thurgood wrote:

[#15370] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/06

Eric Hodel wrote:

[#15373] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/06

Hi,

[#15374] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/06

Nobuyoshi Nakada wrote:

[#15412] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/07

Hi,

[#15413] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/07

Nobuyoshi Nakada wrote:

[#15414] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/07

Hi,

[#15360] reopen: can't change access mode from "w+" to "w"? — Sam Ruby <rubys@...>

I ran 'rake test' on test/spec [1], using

16 messages 2008/02/05
[#15369] Re: reopen: can't change access mode from "w+" to "w"? — Nobuyoshi Nakada <nobu@...> 2008/02/06

Hi,

[#15389] STDIN encoding differs from default source file encoding — Dave Thomas <dave@...>

This seems strange:

21 messages 2008/02/06
[#15392] Re: STDIN encoding differs from default source file encoding — Yukihiro Matsumoto <matz@...> 2008/02/06

Hi,

[#15481] very bad character performance on ruby1.9 — "Eric Mahurin" <eric.mahurin@...>

I'd like to bring up the issue of how characters are represented in

16 messages 2008/02/10

[#15528] Test::Unit maintainer — Kouhei Sutou <kou@...>

Hi Nathaniel, Ryan,

22 messages 2008/02/13

[#15551] Proc#curry — ts <decoux@...>

21 messages 2008/02/14
[#15557] Re: [1.9] Proc#curry — David Flanagan <david@...> 2008/02/15

ts wrote:

[#15558] Re: [1.9] Proc#curry — Yukihiro Matsumoto <matz@...> 2008/02/15

Hi,

[#15560] Re: Proc#curry — Trans <transfire@...> 2008/02/15

[#15585] Ruby M17N meeting summary — Martin Duerst <duerst@...>

This is a rough translation of the Japanese meeting summary

19 messages 2008/02/18

[#15596] possible bug in regexp lexing — Ryan Davis <ryand-ruby@...>

current:

17 messages 2008/02/19

[#15678] Re: [ANN] MacRuby — "Rick DeNatale" <rick.denatale@...>

On 2/27/08, Laurent Sansonetti <laurent.sansonetti@gmail.com> wrote:

18 messages 2008/02/28
[#15679] Re: [ANN] MacRuby — "Laurent Sansonetti" <laurent.sansonetti@...> 2008/02/28

On Thu, Feb 28, 2008 at 6:33 AM, Rick DeNatale <rick.denatale@gmail.com> wrote:

[#15680] Re: [ANN] MacRuby — Yukihiro Matsumoto <matz@...> 2008/02/28

Hi,

[#15683] Re: [ANN] MacRuby — "Laurent Sansonetti" <laurent.sansonetti@...> 2008/02/28

On Thu, Feb 28, 2008 at 1:51 PM, Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

Non-local exits via throw/rescue: Re: Timeout::Error

From: Kurt Stephens <ks@...>
Date: 2008-02-08 04:07:47 UTC
List: ruby-core #15426
MenTaLguY wrote:
> On Thu, 7 Feb 2008 09:37:57 +0900, Kurt Stephens <ks@kurtstephens.com> wrote:
>>   We use Timeout frequently for computations that we explicitly want to
>> stop after a specific amount of time; we have hard timing constraints.
>> If we can't compute it in time, we need to decide on a different course
>> of action.
> 
> How hard are your timing constraints?  Remember that the delivery
> of Thread#kill is not necessarily instantaneous, depending on how other
> threads are scheduled.  Would it be feasible to check a flag or an
> elapsed time during the computation itself?
>  

  I need to return /something/ to a caller within a fixed time frame or
else, let's just say, I lose an opportunity and money.  I have no
guarantees that my computation will complete in that time frame,
because, just like my caller, I'm dealing with unreliable services
outside of my control.  I'm able cut my losses by doing some recovery on
the terminated computation, and even live with cases where Thread#kill
is not instantaneous, reliable nor correct, as long as it is a small
fraction.

>> The only thing that is "exceptional" about Timeout errors is the
>> delivery mechanism.
>
> It's the delivery mechanism that's the basic problem; in a language
> with side-effects (like Ruby), it is seldom possible to write code that
> is entirely robust against asynchronous exceptions, and worse, most of
> Ruby stdlib is not robust against them, so you must avoid any stdlib
> code except simple blocking calls.

  The use of throw/rescue is a reasonable mechanism for dealing with
intentional, dynamically-scoped, non-local exits, like Timeout or
Kernel#exit, in a thread-aware language.   I'd love to see a better
solution, given that continuations seem to be deprecated.

  Can throw/rescue be changed to #=== to catch objects that are not
Exceptions?  Like:

catch_tag = [ :some_unique_object ]
begin
  throw catch_tag
rescue catch_tag => data
  do_something data
end

That would be generic, typeless and kinda cool. :)

  I don't want rescues on exceptional errors to "eat" intentional
non-local exits, just because there is a broken top-level rescue in irb
or in libraries that cannot enumerate all the possible non-local exit
exceptions classes and rethrow them correctly.  Rcov, for example,
didn't handle SystemExit correctly, so it was impossible for a program
under rcov to exit() with a exit status.

  That's why there should be a different standard superclass for
intentional non-local exits for Timeout::Error, Kernel#exit, etc. that
is not commonly trapped for logging, etc.  I'm not really sure if a
throwable superclass for that purpose exists in Ruby 1.8 or 1.9 by
convention, design or at all.

> Given that, as long as none of the mutable objects modified by your
> aborted computation persist past the timeout, you are okay, but that
> is more difficult to achieve than you might naively expect.
> 

  Agreed, side-effects are the tricky part of any recovery from any
non-local exit: don't make side-effects that are not recoverable if
recovery is needed.  It's not that hard.  :)

> -mental
> 

http://kurtstephens.com/

In This Thread