Nick Gaya <nicholasgaya+git...@gmail.com> added the comment:

@msg358296:

> IMO, it seems rather counter-intuitive to have to specify 
> `concurrent.futures.TimeoutError` when using a timeout for the future 
> returned by `run_coroutine_threadsafe()`.

I think that's expected, given that the function returns a 
`concurrent.futures.Future` object. The `Future.result()` method behaves the 
same regardless of the executor.

@avsetlov:

> futures._chain_future() should convert exceptions. Seems 
> _convert_future_exc() does this work already but maybe it fails somehow. We 
> need to investigate more.

The `_convert_future_exc()` only converts `concurrent.futures` exceptions to 
`asyncio` exceptions, not the reverse. I'm not sure if this is intentional or 
not.

With the current behavior there are two types of timeout errors that can occur 
in the example snippet:

* If the coroutine itself throws an `asyncio.exceptions.TimeoutError`, this 
will be propagated as-is to the `concurrent.futures.Future` object and thrown 
by `future.result()`.

* If the coroutine does not terminate within the timeout supplied to 
`future.result()`, then the method will throw a 
`concurrent.futures.TimeoutError` without changing the state of the future or 
the associated coroutine.

It's only necessary to cancel the future in the second case, as in the first 
case it's already in a finished state. So the example should catch 
`concurrent.futures.TimeoutError` rather than `asyncio.TimeoutError`.

----------
nosy: +nickgaya

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue39027>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to