Well, TimeoutError is raised when the timeout (optionally) passed to the as_completed() call is reached. CancelledError means that cancel() was called, which can be for a different reason (e.g. an impatient user or a disconnected socket). Note that on TimeoutError, the tasks being waited for are *not* cancelled (if you want that to happen you should catch TimeoutError and cancel them yourself).
On Thu, Mar 5, 2015 at 10:35 AM, Gustavo Carneiro <[email protected]> wrote: > > > On 5 March 2015 at 18:10, Guido van Rossum <[email protected]> wrote: > >> On Thu, Mar 5, 2015 at 9:04 AM, Gustavo Carneiro <[email protected]> >> wrote: >> >>> >>> >>> >>> On 3 March 2015 at 19:01, Gustavo Carneiro <[email protected]> wrote: >>> >>>> >>>> >>>> On 2 March 2015 at 10:12, Victor Stinner <[email protected]> >>>> wrote: >>>> >>>>> Hi, >>>>> >>>>> To answer Luciano's question on as_completed(), I read the source code >>>>> of the function. It's not clear to me what happens on timeout. >>>>> >>>>> >>>>> Should we abort something on timeout? The documentation doesn't >>>>> explain if tasks are cancelled or if an exception is set. In the code, >>>>> it's clear that the task is not touched. It's probably just a >>>>> documentation issue. >>>>> >>>> >>>> I think it should cancel the wrapped task. I think this is what the >>>> programmer will want most of the time, and in case he doesn't want it he >>>> can use shield() to prevent it. >>>> >>> >>> I wasn't very clear: I think it should cancel the still running >>> uncompleted tasks AND raise an exception, both. That would be consistent >>> with the way wait_for() behaves. >>> >> >> *What* exactly should raise an exception? Note that we're speaking of: >> >> @asyncio.generator >> def blah(): >> for cf in as_completed(...): >> r = yield from cf # <---------- HERE >> <do something with r> >> >> and what's happening is that blah is being cancelled when it is waiting >> for cf at the line marked "HERE". The cancellation mechanism already works >> by sending an exception (CancelledError) into the blocked task (i.e. cf, >> which represents _wait_for_one() in as_completed()). This exception >> normally comes right out, and that's the desired behavior here. I don't >> think a different exception should be raised, unless I am missing >> something? >> > > You're not missing anything, I was. Anyway, as long as there is an > exception somewhere, I'm happy. > > Well, I could be slightly happier if the exception was TimeoutError > instead of CancelledError, but I'm happy enough :-) > > Cheers. > > -- > Gustavo J. A. M. Carneiro > Gambit Research > "The universe is always one step beyond logic." -- Frank Herbert > -- --Guido van Rossum (python.org/~guido)
